Slack 通知を送信する

Laravel 5.3+ で実装された Notification を使用して Laravel でいつでもどこでも Slack 通知を発火する。

Notification は RoutesNotifications トレイトを継承しているすべてのクラスから発火することが可能。必要に応じてユーザーの Slack Webhookに通知を飛ばすことも可能だが、通常はアプリケーション運営側の同一チームに送信することが主であろう。そのため、通知を飛ばすクラス (notifiable) に以下のようなトレイトを継承させておくと使いやすい。

なお、このトレイトを Notifiable と同時に継承してしまうと同レベルで同じトレイト(RoutesNotifications)を継承しているため同時重複宣言エラーとなってしまうので注意されたい。


設置準備

Slack Webhook URL の取得

当たり前だが、Slackに通知するにはSlack側にアプリを登録しておく必要がある。Laravelの Slack Webhook channel では Incoming Webhooks を利用するのでここから登録し、Webhook の URLを取得しておく。

なお、発行されるURLは https://hooks.slack.com/services/{{チームID}}/B4X8MFMK8/{{キー}} の形となる。

また、このページから自動投稿に使用するデフォルトのchや表示名、アイコンを設定できる。これら (Label以外) は投稿時に個別に設定することも可能。

(~5.7) Guzzle HTTP Client のインストール

新規に作成したLaravel アプリには guzzle がインストールされていない。Slack Webhook Channel はこれを利用しているので入っていなければインストールする。

(5.8+) Slack Channel のインストール

Laravel 5.8 でこの Slack チャンネルは外部パッケージに分離されたので、これをインストールする必要がある。なおこのパッケージの依存関係としてguzzleはついてくるので上記の操作は飛ばせる。

Notifiable を継承

通知を呼びすクラス (notifiable) で Notifiable 、または上記の SlackNotifiable を継承 (use) する。notifiableに使用するクラスは何でもいいが、一般に Model (Entity) なクラスに持たせるのが使いやすい。

SlackNotifiable を使用しなかったのならば、上で取得したURLを返す routeNotificationForSlack メソッドをそのクラスに用意しておこう。

デフォルトの User モデルだとこんな感じ。

公開するアプリとかだったらカスタマイズ性を高められる方がいいが、テストに使う分には十分だろう。

コラム: ユーザーが指定したWebhookに投げる

Laravel アプリからユーザーの Slack への投稿権を得る方法はいくつかあるだろう。例えば、上記の方法で取得した URL をユーザー設定で登録してもらう。あるいは、Slack apps の OAuth 2 で incoming-webhook を 付与してやればWebhook用のURLを得ることが出来る。(前者の場合はバリでとか考えるのが面倒そう:: esa.io とかは前者。)

例えばこのURLをそのユーザーの routeNotificationForSlack で返してやり、そのモデルに対して notify メソッドで SlackNotification を投げてやればユーザーのSlackに通知を飛ばすことが可能だろう。(このメソッドでfalsyな値を返せば通知の送信はスキップされる)

この場合、ユーザーの指定したchにきちんと通知の飛ぶよう、SlackMessage (後述) にchを設定すべきでない。

Notification の作成と送信

Notification の扱い方はメール通知のときと大してかわらない。また、1つのNotificationからメール、Slack……のように複数に同時送信することも可能だが、今回は省略する。

Notification

通知のクラスを作成してやる。例えば以下の例ではSlackに次のような通知が送信される。

(通知の送信にQueueを使用する場合はShouldQueueも継承する)

このほか、$message->to('#hoge') で送信先CHを指定したりも出来るので、SlackMessageSlackAttachment の APIドキュメントも参考に。

送信

通知を送りたいタイミングで notifiableのnotifyメソッドを呼んでやるのみ。

上記 Notification の場合、コンストラクタで対象を渡しているのでこんな感じ。

(メール通知と組み合わせてみる: https://gist.github.com/hinaloe/042fdb4d5e03965fb2557f283cfcf9d1 )

作成時のテストには routes/console.php でコマンドを設定してやり、artisanから呼ぶと捗る。

また、Notification の toSlack や via にはnotifiable (ここでは $user)が渡されるので、これを利用するのも捗るかもしれない。


最近はシステムの通知をすべてSlackに一元化してポジションにかかわらずサービスを管理、見渡しやすくなった。(もちろん同ポジションのものは他にもあったわけだが)

通知チャンネルとしては欠かせないものなので、それが標準機能で簡単に使えるのは嬉しい。うまく活用できるといいだろう。

コメントを残す