Notificationsとは

通知のことですね。つまり、サーバから特定のチャンネル(メール、Slackなど)にメッセージを送ることができます。この機能はバージョン5.3から追加された機能のひとつです。使い方もとても簡単なので気軽にアプリケーションに実装できます。

以下はlaravelの日本語訳のリファレンスサイトのreadouble.comの通知ページからの引用です。

通常、通知はアプリケーションで何かが起きたことをユーザへ知らせる、短い情報メッセージです。たとえば、課金アプリを作成しているなら、メールとSMSチャンネルで「課金支払い」を送信できます。

作り方

Laravelと言えばartisanコマンドですよね。このコマンドで一発です。

$ php artisan make:notification 

このコマンドを実行するとappディレクトリ以下にNotificationsディレクトリが作成されます。そして、Notificationsディレクトリにコマンドで指定したファイルが作成されます。

このコマンドで作成されたファイルは通知に関する内容を定義するファイルです。どのチャンネルに通知するか、どんな内容で通知するか、などを定義します。

使い方

Slackに通知する場合、Guzzleというライブラリが必要になります。これはPHPでHTTPリクエストを扱うためのものですが、詳しくはGuzzleのGithubを見てください。

composerでインストールするのが手っ取り早いので、以下のコマンドを実行しましょう。

$ composer require guzzlehttp/guzzle

さて、実際に通知するにはNotifiableトレイトかNotificationファサードを使います。Notifiableトレイトはnotify()を使い、Notificationファサードはsend()を使えば通知することができます。

デフォルトではapp/User.phpNotifiableトレイトが使われています。必ずしもこのクラスを使わなければならないということはなく、Notifiableトレイトをuseしていれば使えるようになります。

今回はよくある例としてSlackの特定のチャンネルに通知することにします。Slackに通知する場合は、Webhook URLが必要になりますのでそれも用意します。

使用するファイルは以下になります。

  • routes/web.php
  • app/User.php
  • app/Notifications/InvoicePaid.php

まずは、以下のコマンドを使って通知内容を定義するファイルを作成します。クラス名はなんでもいいですが、Laravelの公式ドキュメントと同じにしました。

$ php artisan make:notification InvoicePaid

作成されたファイルにはいくつかのメソッドがすでに記述されています。toMail()toArray()は今回使用しないので削除しました。

via()は通知対象を配列で返すメソッドです。つまり、メールなのかSlackなのかを選択します。また配列で指定するので複数のチャンネルに通知できます。

Slackに通知するのでtoSlack()が必要になります。このメソッドには通知内容を記述します。

戻り値としてSlackMessageのインスタンスを指定します。メソッドをチェーンすることでより詳細な通知内容を表現できます。また、戻り値は通知したいチャンネルによって変更します。メールならMailMessageを、SMSならNexmoMessageを、といった感じです。

※SMSに通知する場合はnexmo/clientというComposerパッケージをインストールし、オプションを設定する必要があります。

次にUser.phpです。このクラスはNotifiableトレイトを使用し、チャンネルに対する通知を指定します。このクラスで必要になるメソッドが、routeNotificationFor○○です。

この○○にはサービス名が入ります。SlackならrouteNotificationForSlackになり、EverNoteならrouteNotificationForEvernoteとなります。

また、routeNotificationForSlackの戻り値にWebhook URLを指定します。SlackチームのメニューにApps&integrationsがあるので、ここでWebhook URLを取得します。

まずはIncominge Webhooksを検索します。

Incoming Webhookを検索

次にAdd Configurationをクリックします。

Add Configurationをクリック

Post to Channelで通知したいチャンネルを選択し、Add Incoming Webhooks integrationをクリックします。今回はlaravelというチャンネルに通知します。

チャンネルの選択

Webhook URLという項目があるので、これを先ほどのrouteNotificationForSlackの戻り値に指定しましょう。

Webhook URLの取得

最後に通知を行います。web.phpに2行記述します。

やっていることは簡単ですね。Notifiableトレイトを使っているクラスのnotify()を使うだけです。引数に通知内容を定義したクラス(InvoicePaiクラス)を指定しましょう。

これでビルトインサーバを立ち上げてlocalhost:8000にアクセスすると、画面は真っ白ですがSlackに通知がいくはずです。

結果はこうなるはずです。

Slackに通知した結果

今回は通知だけを行うためにweb.phpに記述しましたが、コントローラーに記述するようにしましょう。

まとめ

Slackの通知に必要なもの

  • Guzzleライブラリ
  • Webhook URL
  • 通知を指示するクラス(web.php)
  • 実際に通知するクラス(User.php)
  • 通知内容を定義するクラス(InvoicePaid.php)

以下のディレクトリで、デフォルトで対応しているチャンネルの通知内容に関するMessageクラスがあるので確認するといいと思います。

\vendor\laravel\framework\src\Illuminate\Notifications\Messages

また、連携できるサービスはLaravel Notification Channelsで確認できます。