🔖

【Laravel】Slack通知を実装する

2021/05/08に公開

この記事を読んでわかること

  • Laravelを使用してSlack通知を実装する手順

使用環境

  • Laravel 5.5.49
  • PHP 7.1.29

全体の流れ

  1. Slack WebHookのURLを取得
  2. Notificationクラスの作成
  3. 処理を実行する本体のサービスクラスを作成
  4. ファーサードクラスを作成
  5. サービスプロバイダの作成
  6. 使用する

Slack WebHookのURLを取得

事前準備として、Slack WebHookのURLを取得します。

取得手順は、以下の記事が参考になりました。

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

取得したURLを.envファイルに記載します。

SLACK_CHANNEL=取得したURL

参照する際はconfig経由で行うため、登録します。また、後ほど使用するため、プロバイダーとエイリアスの登録の記載もします。

(config経由で使用する理由については、Laravel の .env の値は config() 経由で使う
Laravel PHP
の記事が参考になりました。)

app/config/app.php

'slack_url' => env('SLACK_CHANNEL'),

'providers' => [
        /*省略*/
        App\Providers\SlackServiceProvider::class,//追記
],
'aliases' => [
        /*省略*/
        'Slack' => App\Services\Slack\SlackFacade::class,//追記
],

更新したあとに以下のコマンドを実行して、キャッシュをクリアします。

$ php artisan config:cache

Notificationクラスの作成

$ composer require guzzlehttp/guzzle //Guzzle HTTPライブラリをインストール

$ php artisan make:notification SlackNotification

コマンド実行でapp/Notifications配下にファイルが作成されます。

ファイルの中身と記述内容に関しては以下に記載します。

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 $message;
    protected $channel;

    public function __construct($message) {
        $this->message = $message;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['slack'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toSlack($notifiable)
    {
        return (new SlackMessage)
            ->from('hoge')
            ->to($this->channel)
            ->content($this->message);
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

処理を実行する本体のサービスクラスを作成

今回は、Slack通知用に、app/Services配下に新しくSlackディレクトリを作成してファイルを追加していきます。

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));
    }

    public function routeNotificationForSlack() {
        return config('app.slack_url');
    }
}

ファーサードクラスを作成

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';
    }

}

サービスプロバイダの作成

$ php artisan make:provider SlackServiceProvider

コマンド実行で、app/Providers/SlackServiceProvider.phpが作成されます。

ファイルの中身と記述内容に関しては以下に記載します。

app/Providers/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()
    {
        //追記
        $this->app->bind(
            'slack',
            'App\Services\Slack\SlackService'
        );
    }
}

使用する

使用したいファイルにuse Slack;を記載し、Slack::send('送信したいメッセージ')と記載すると、Slackに通知が届きます。

参考記事

https://readouble.com/laravel/5.5/ja/notifications.html
https://qiita.com/ysg/items/b22c9e65676ecdf2774e
https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

Discussion