Laravel 5.8 Slackに通知を送信する(laravel/slack-notification-channel)

Laravel 5.8
laravel/slack-notification-channelを利用してSlackへの通知を試してみました。

本家のドキュメントはこちら
https://laravel.com/docs/5.8/notifications#slack-notifications


Slack Webhook URL



プログラムの前に通知先のURLを取得しておきます。
こちらにアクセスしWebhook URLを作成します。
https://slack.com/apps/A0F7XDUAZ

a04_01.png

a04_02.png

a04_03.png


https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
という形式のURLが取得できると思います。

.envファイルに追記しておきます。

・.env


SLACK_URL=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX




laravel/slack-notification-channel



つづいて、slack通知用のライブラリ「laravel/slack-notification-channel」をインストールします。


$ composer require laravel/slack-notification-channel






Notifiable



Slackへの通知はNotifiableトレイトを使用しているクラスに対して実行可能となります。
サンプルして、デフォルトで存在するApp\Userを変更しSlackへの通知を可能にしています。

・app/User.php


  1. <?php
  2. namespace App;
  3. use Illuminate\Notifications\Notifiable;
  4. use Illuminate\Contracts\Auth\MustVerifyEmail;
  5. use Illuminate\Foundation\Auth\User as Authenticatable;
  6. class User extends Authenticatable
  7. {
  8.     use Notifiable;
  9.     /**
  10.      * The attributes that are mass assignable.
  11.      *
  12.      * @var array
  13.      */
  14.     protected $fillable = [
  15.         'name', 'email', 'password',
  16.     ];
  17.     /**
  18.      * The attributes that should be hidden for arrays.
  19.      *
  20.      * @var array
  21.      */
  22.     protected $hidden = [
  23.         'password', 'remember_token',
  24.     ];
  25.     /**
  26.      * The attributes that should be cast to native types.
  27.      *
  28.      * @var array
  29.      */
  30.     protected $casts = [
  31.         'email_verified_at' => 'datetime',
  32.     ];
  33.     // 以下を追加
  34.     public function routeNotificationForSlack($notification)
  35.     {
  36.         return env('SLACK_URL');
  37.     }
  38. }






Notification



通知する内容はNotificationクラスで指定します。
以下のコマンドでクラスの雛形を作成。


$ php artisan make:notification SampleNotification




app/Notifications/SampleNotification.phpが出力されます。
内容を以下のように編集。

・app/Notifications/SampleNotification.php


  1. <?php
  2. namespace App\Notifications;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Notifications\Notification;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Notifications\Messages\MailMessage;
  7. use Illuminate\Notifications\Messages\SlackMessage;
  8. class SampleNotification extends Notification
  9. {
  10.     use Queueable;
  11.     public function __construct()
  12.     {
  13.     }
  14.     public function via($notifiable)
  15.     {
  16.         return ['slack'];
  17.     }
  18.     public function toArray($notifiable)
  19.     {
  20.         return [
  21.         ];
  22.     }
  23.     public function toSlack($notifiable) {
  24.         return (new SlackMessage)
  25.             ->from('Bomb', ':bomb:') // 送信元
  26.             ->to('#general ') // 送信先
  27.             ->content('Slackへの通知テスト'); // メッセージ
  28.     }
  29. }




送信テスト用のコマンドを作成します。
・app/Console/Commands/SampleCommand.php


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. class SampleCommand extends Command
  8. {
  9.     protected $signature = 'my:command';
  10.     protected $description = 'コマンドサンプル';
  11.     public function __construct()
  12.     {
  13.         parent::__construct();
  14.     }
  15.     public function handle()
  16.     {
  17.         // Notifiableなオブジェクトを作成
  18.         $user = new User();
  19.         // 対象にSlackメッセージ配信
  20.         $user->notify(new SampleNotification());
  21.         
  22.     }
  23. }




実行


$ php artisan my:command



お手軽にSlackへ通知できました。

a04_04.png


複数人への一括配信



複数人に一括で配信したい場合は、Notification::sendが便利です。


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. use Illuminate\Notifications\Notification;
  8. class SampleCommand extends Command
  9. {
  10.     protected $signature = 'my:command';
  11.     protected $description = 'コマンドサンプル';
  12.     public function __construct()
  13.     {
  14.         parent::__construct();
  15.     }
  16.     public function handle()
  17.     {
  18.         // Notifiableなオブジェクトを作成
  19.         //$user = new User();
  20.         // 対象にSlackメッセージ配信
  21.         //$user->notify(new SampleNotification());
  22.         $users = [];
  23.         $users[] = new User();
  24.         \Notification::send($users, new SampleNotification());
  25.         
  26.     }
  27. }





ユーザーごとにメッセージ内容を変更



SampleNotificationのtoSlackは、Notifiableトレイトをuseしているオブジェクトが渡されます。
今回の例だとUserオブジェクトが$notifiableとして渡されます。

ユーザーごとにメッセージを変更したい場合は、$notifiableの内容により処理を変更すればOKです。

・SampleNotification.php


  1. <?php
  2. namespace App\Notifications;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Notifications\Notification;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Notifications\Messages\MailMessage;
  7. use Illuminate\Notifications\Messages\SlackMessage;
  8. class SampleNotification extends Notification
  9. {
  10.     use Queueable;
  11.     public function __construct()
  12.     {
  13.     }
  14.     public function via($notifiable)
  15.     {
  16.         return ['slack'];
  17.     }
  18.     public function toArray($notifiable)
  19.     {
  20.         return [
  21.         ];
  22.     }
  23.     public function toSlack($notifiable) {
  24.         return (new SlackMessage)
  25.             ->from('Bomb', ':bomb:') // 送信元
  26.             ->to('#general ') // 送信先
  27.             ->content('Slackへの通知テスト:'.$notifiable->name); // メッセージ
  28.     }
  29. }




・SampleCommand.php


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. use Illuminate\Notifications\Notification;
  8. class SampleCommand extends Command
  9. {
  10.     protected $signature = 'my:command';
  11.     protected $description = 'コマンドサンプル';
  12.     public function __construct()
  13.     {
  14.         parent::__construct();
  15.     }
  16.     public function handle()
  17.     {
  18.         $users = [];
  19.         $userA = new User();
  20.         $userA->name = 'Aさんへのコメント';
  21.         $users[] = $userA;
  22.         $userB = new User();
  23.         $userB->name = 'Bさんへのコメント';
  24.         $users[] = $userB;
  25.         $userC = new User();
  26.         $userC->name = 'Cさんへのコメント';
  27.         $users[] = $userC;
  28.         \Notification::send($users, new SampleNotification());
  29.         
  30.     }
  31. }




実行結果

a04_05.png

その他の使い方は、本家のドキュメントが詳しいです。
https://laravel.com/docs/5.8/notifications#slack-notifications



【参考URL】
https://laravel.com/docs/5.8/notifications#slack-notifications
Slack 通知を送信する
LaravelでFacadeを作ってSlackに通知してみた

関連記事

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ