Laravel Notifications を利用すると簡単にメールや Slack などの通知機能を実装することができます。今回は小ネタとして、 Slack の通知先チャンネルを環境変数から設定する方法とその注意点について紹介します。
TL;DR
- 専用の config ファイルを作成して環境変数から WebHook URL を読み込むようにする。
- 通知のジョブを処理するワーカーの実行環境をアプリと分離している場合でも、環境変数はアプリの実行環境に設定する。
実装
以下では EC サイト上で注文が作成された際に Slack の特定のチャンネルに通知するシチュエーションを想定しています。
まず Slack の通知先チャンネルの WebHook URL を取得するため、 Laravel Configuration に従って設定を行います。設定ファイルは好きな名前で構いませんが、ここでは config/slack.php
という名前にしてみます。
return [
'orders_channel_url' => env(
'SLACK_ORDERS_WEB_HOOK_URL',
'https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx'
),
];
環境変数 SLACK_ORDERS_WEB_HOOK_URL
が設定されていれば orders_channel_url
にその値を設定しますが、設定されていない場合は env()
の第二引数が使用されます。
ローカル環境や開発環境からの通知先として開発専用のチャンネルを作成し、その WebHook URL をデフォルトに設定しておくと便利です。
次に通知先の情報を持つ Notifiable クラスを作成します。依存パッケージとして laravel/slack-notification-channel が必要なので composer 等で事前にインストールしておいてください。
<?php
namespace Infra\Notification\Notifiable;
use Illuminate\Notifications\Notifiable;
class OrdersChannelNotifiable
{
use Notifiable;
private $slackWebHookUrl;
public function __construct()
{
$this->slackWebHookUrl = config('slack.orders_channel_url');
}
public function routeNotificationForSlack()
{
return $this->slackWebHookUrl;
}
}
config('slack.orders_channel_url')
で先ほどの config に設定された WebHook URL が取得できるため、それが routeNotificationForSlack()
の返り値となるようにします。
後はドキュメントや以下の記事などを参考に Notifications を構築していきましょう。
環境変数の設定先
アプリ側のレスポンスタイムの悪化を避けるため、 Notification をキューに積むこともできます。
キューの利用に伴ってアプリ環境とワーカー環境を分離するインフラ構成を採用している場合でも、環境変数は config('slack.orders_channel_url')
を実行して Notifiable インスタンスを生成するアプリ側に設定する必要があります。
ワーカー環境に環境変数を設定しても通知先チャンネルはデフォルトのまま変わらないので注意してください。