laravel で通知(slack/mattermost)を試す。
laravel で slack に通知(メッセージ送信)をする。
slack 互換のapi がある、mattermostでも「内向きウェブフック」を使えば同じように通知が出来る。
準備
- webhook incoming のアドレス(URL)
- composer でパッケージインストール
作業の流れ
- 通知クラスを作る
- 通知テスト用コマンドを作る
- 通知(メッセージ送信)を実行する
クラスを作る
php artisan make:notification MyFirstNotification php artisan make:command SendNotifySlackSample
通知クラスを作る
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Messages\MailMessage; class MyFirstNotification extends Notification { use Queueable; public function __construct () { } public function via ( $notifiable ) {// 通知経路を書く、利用可能名を登録 return ['slack']; } public function toSlack($notifiable){// 内容を書く。通知'slack'指定時に呼びされる。 $msg = new SlackMessage(); $msg->content('Hello from Laravel'); return $msg; } public function toArray ( $notifiable ) { return []; } }
コマンドを作る
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Notification; use App\Notifications\MyFirstNotification; class SendNotifySlackSample extends Command { protected $signature = 'notify:slack'; protected $description = '通知サンプル'; public function handle () :int { // 第2引数に、内向きウェブフック(incoming webhook)で作成されたアドレスを指定 Notification::route('slack','https://mm.example.com/hooks/od6h5kme1ixxxxxxxxxx') ->notify(new MyFirstNotification() ); return 0; } }
mattermost のときはslackのURLの代わりに、Mattermostで作成したアドレスを入れるだけである。互換性って便利。
Slack/mattermostにメッセージ送信
php artisan notify:slack
これで無事にSlackチャンネルに届くはずである。
うまく届かないとき
curl コマンドで Slack/Mattermostのアドレスが正しく動くかテストしておこう。
URL=https://mm.example.com/hooks/od6h5kme1ixxxxxxxxxx' curl -i -X POST \ -H "Content-Type: application/json"\ -d "{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}" \ $URL
送信ができたら
laravel では、通知はさらに抽象化してパーツに組み合わせて利用する。
- 通知をためておいてまとめて送信するキュー機能
- イベント発生・イベントリスナを登録するイベント機能
- ユーザーごとに通知先を設定するUserモデル機能
などがあるので、組み合わせて使っていく。