『Laravel』で『タスク管理システム』を自作していて、
- 仕事の内容
- 担当者の割り当て
- 締め切り
- 進捗状況
などがわかるようにしています。
また、
情報共有のために『Slack(スラック)』も使っています。
- Slack(スラック)・・全世界で大人気な多機能チャットツール
せっかくなら、
『タスク管理システム』で新しく投稿したり編集したタイミングで、
『Slack』にも通知したいなと思い、
いろいろググって実装したので、その方法をまとめてみました。
LaravelでSlackに通知する方法 変更するファイル
いろいろとググって試して、
今回は『ファサード』を使う方法で設定する事にしました。
- ファサード・・玄関という意味。
『Slackファサード』を自作する事で、
コントローラ内で、
Slack::send(‘なんちゃら’);
と入力しておけば、『Slack』側にも通知がいくようになります。
※実際はなんちゃらの箇所は変数で指定しています。
大きく3つのパートに分けて設定しています。
- 初期設定
- Notification作成
- ファサード作成(サービス・ファサード・プロバイダ)
LaravelでSlackに通知する方法 1. 初期設定
まずは初期設定をば。
『Slack』には通知設定用の『webhook(ウェブフック)』という仕組みがあるので、
通知したい『Slackワークスペース』の『webhook URL』を取得します。
1-1 Slackのwebhook URLを取得
このアドレスにアクセスします。
通知したい『チャンネル』を指定して作成します。
生成された『Webhook URL』をコピーしておきます。
1-2. 環境ファイル .env に追記
取得した『webhook URL』を、
『.env』ファイルに追記しておきます。
合わせて、通知する際の名前もつけておきます。
// app/.env 〜中略〜 SLACK_CHANNEL=#general SLACK_NAME=Laravel_bot SLACK_URL=https://hooks.slack.com/services/XXXXX
1-3. guzzleのインストール
Laravel 5.3〜5.7の場合、
Laravelの『通知機能』では『guzzle(ガズル)』が使われているので、
『guzzle』をインストールする必要があります。
- guzzle ・・ PHPのHTTPクライアント。HTTPリクエストを簡単に実現できる
『composer(コンポーザー)』がインストールされている状態で、
コマンドプロンプトから『guzzle』をインストールします。
- composer ・・PHPをパッケージ管理してくれるツール
$ composer require guzzlehttp/guzzle ~コマンド実行後の表示~ Using version ^6.3 for guzzlehttp/guzzle ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) 〜中略〜 Package manifest generated successfully.
インストール後、
『composer.json』に追記されていればOKです。
// app/composer.json 〜中略〜 "require": { "php": ">=7.0.0", "electrolinux/phpquery": "^0.9.6", "fideloper/proxy": "~3.3", "guzzlehttp/guzzle": "^6.3", //追記されていればOK "laravel/framework": "5.5.*", "laravel/tinker": "~1.0", "weidner/goutte": "^1.1" }, 〜中略〜
参考記事
LaravelでFacadeを作ってSlackに通知してみた
LaravelでSlackに通知する方法 2 Notificationクラス作成
『Laravel』では標準で、
メールやSlackなどで通知をするための専用のクラスが用意されています。
コマンドプロンプトから『Notification』クラスを追加します。
$ php artisan make:notification SlackNotification >Notification created successfully
生成された『Notification』ファイルはこんな感じ。
// app/Notification/SlackNotification.php <?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; class SlackNotification extends Notification { use Queueable; /** * Create a new notification instance. * * @return void */ public function __construct() { // } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('The introduction to the notification.') ->action('Notification Action', url('/')) ->line('Thank you for using our application!'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
初期設定だとメール通知として生成されるので、
『Slack』に通知するように書き換えます。
// app\Notifications\SlackNotification.php <?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\SlackMessage; // 追記 class SlackNotification extends Notification { use Queueable; protected $channel; //追記 protected $name; //追記 protected $message; //追記 /** * Create a new notification instance. * * @return void */ public function __construct($message = null) //追記 { $this->channel = env('SLACK_CHANNEL'); //追記 $this->name = env('SLACK_NAME'); //追記 $this->message = $message; //追記 } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['slack']; //slackに設定 } /** * Slack通知表現を返します * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\SlackMessage */ public function toSlack($notifiable) //追記 { $message = (new SlackMessage) ->from($this->name) ->to($this->channel) ->content($this->message); return $message; } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
変更点として、
- コンストラクタ(クラス生成時に実行)で変数定義
- use でSlackMessage を追記
- viaメソッドに slack を設定
- toSlack メソッドを作成
しています。
LaravelでSlackに通知する方法3 ファサードを作成
『Slackファサード』を自作するために、4段階でファイルを作成していきます。
3-1. 『Notifiable』トレイトを使ってSlack通知機能をつくる
3-2. 『Slackファサード』をつくる
3-3. 『サービスプロバイダ』をつくる
3-4. config/app.php に追記する
3-1. Notifiableトレイトを使う
app/Services/Slack フォルダを作成して、
その中に、 SlackService.php ファイルを作成して記載します。
// app/Services/Slack/SlackService.php <?php namespace App\Services\Slack; use Illuminate\Notifications\Notifiable; use App\Notifications\SlackNotification; class SlackService { use Notifiable; public function send($message = null) { $this->notify(new SlackNotification($message)); } protected function routeNotificationForSlack() { return env('SLACK_URL'); } }
- Notifiableトレイトを追加する
- 通知先のURLを返すrouteNotificationForSlackメソッドを追加
- 通知処理の中で$this->notify()を呼び出す
しています。
『トレイト』関連記事
補足 Notificationの中身を見てみる
ここは余談ですが、
app/vendor/laravel/framework/src/Illuminate/Notifications/
の中に『Notifications(通知)』関連のファイルがずらっと保存されているので、
さらっと見ておくといいのではと思います。
// Notifiable.php <?php namespace Illuminate\Notifications; trait Notifiable { use HasDatabaseNotifications, RoutesNotifications; }
notifyメソッド。
// RoutesNotifications.php <?php namespace Illuminate\Notifications; use Illuminate\Support\Str; use Illuminate\Contracts\Notifications\Dispatcher; trait RoutesNotifications { /** * Send the given notification. * * @param mixed $instance * @return void */ public function notify($instance) { app(Dispatcher::class)->send($this, $instance); } 〜中略〜
3-2. Slackファサードを作成する
コントローラ内で、
Slack::send(‘なんちゃら’);
と使えるようにするために、『Slackファサード』を自作します。
app/Services/Slack フォルダの中に、
『SlackFacade.php』 を作成します。
// app/Services/Slack/SlackFacade.php <?php namespace App\Services\Slack; use Illuminate\Support\Facades\Facade; class SlackFacade extends Facade { protected static function getFacadeAccessor() { return 'slack'; } }
- extends で Facadeを継承しています。
Facadeファイルの本体 (Illuminate\Support\Facades\Facade) にgetFacadeAccessor()メソッドがあるので、それを上書きしています。
3-3. サービスプロバイダを作成する
作成した『Slackファサード』を使えるようにするために、
『サービスプロバイダ』を作成します。
- サービスプロバイダ・・Laravel読み込み時に毎回呼び出される仕組み
$ php artisan make:provider SlackServiceProvider > Provider created successfully.
『サービスプロバイダ』作成時は箱だけ作成されています(スケルトンと言ったりします。)。
// app/Provider/SlackServiceProvider.php <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class SlackServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { // } }
こう書き換えます。
// app/Provider/SlackServiceProvider.php <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class SlackServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { $this->app->bind( // 追記 'slack', 'App\Services\Slack\SlackService' ); } /** * Bootstrap services. * * @return void */ public function boot() { // } }
3-4. config/app.php に追記する
作成した『サービスプロバイダ』を、
コンフィグファイルに追記します。
コンフィグファイル内に追記する事で、
『Laravel』が毎回読み込まれるタイミングで『Slack通知』も読み込まれるようになります。
// app/config/app.php 'providers' => [ (省略) App\Providers\SlackServiceProvider::class, (省略) ], 'aliases' => [ (省略) 'Slack' => App\Services\Slack\SlackFacade::class, (省略) ],
LaravelでSlack通知 実際の使い方
適当なコントローラーで、
use Slack;
として『Slackエイリアス』を使えるようにして、
Slack::send(‘なんちゃら’);
と入力する事で、『Slack』側にも通知がいくようになります。
実際には、
- 投稿した人
- 案件番号
- 件名
などを変数として定義しつつ投稿するようにしたりします。
$task_no = $request->id; $title = $request->title; $poster = $request->poster; $post_slack = "${poster} さんが『No.${task_no} : ${title} 』を投稿しました。"; Slack::send($post_slack);
投稿すると、『Slack』側にも通知がいくようになります。
画像は『Laravel』側で設定もできますが、
今回は『Slack』の管理画面から設定しました。
LaravelでSlack通知する方法をまとめてみて
一から『Slack通知』機能をつくろうとするとなかなか大変なんじゃないかと思うのですが、
『Laravel』の色々な機能を組み合わせる事で、
- 早い
- 見やすい
- 修正しやすい
と3点セットな組み込みができました。
『メール』や『Slack』に『通知』する事で、
『スマホ』に『通知』がいくようにもなるので、
出先や在宅でも確認ができるようになるかなと思います。
参考記事
LaravelでFacadeを作ってSlackに通知してみた
LaravelでSlack通知を実装する~ソーシャルではなく開発者/管理者としてのSlack通知~
『Laravel』ではこんな記事も読まれています。
1. 【Laravel】マルチログイン対応ECサイトの講座をリリースしました【Udemy】2. 【PHP/Laravel】初心者向けの動画をリリースしました【Udemy】
3. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】
4. 『Carbon』でよく使うパターンをまとめてみた【Laravel向け】
5. 【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初心者向け】
6. 【Laravel】フロントエンドをわかりやすくまとめてみた【初心者向け】
7. 【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜
8. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】
9. 【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】
10. 【Laravel】Webアプリ環境構築の仕方【Vue.js】【初心者向け】
11. 【Laravel】と【Vue.js】のサンプル動画を見ながらさらりと解説してみる
12. 【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】
13. 【Laravel】フォトギャラリーを作るための画像アップロード方法【php】
14. 【Laravel】多対多テーブルを複数つくる方法【ちょっとコツがいります】
15. 【Laravel】【Slack】に通知する方法をまとめてみた【自作ファサード】
アオキのツイッターアカウント。
この記事へのコメントはありません。