バックエンド

【Laravel】【Slack】に通知する方法をまとめてみた【自作ファサード】

『Laravel』で『タスク管理システム』を自作していて、

  • 仕事の内容
  • 担当者の割り当て
  • 締め切り
  • 進捗状況

などがわかるようにしています。

また、
情報共有のために『Slack(スラック)』も使っています。

  • Slack(スラック)・・全世界で大人気な多機能チャットツール

Slack公式ホームページ

せっかくなら、

『タスク管理システム』で新しく投稿したり編集したタイミングで、

『Slack』にも通知したいなと思い、

いろいろググって実装したので、その方法をまとめてみました。

アオキ
Laravel 5.5 で実装しております。
Sponsored link

LaravelでSlackに通知する方法 変更するファイル

いろいろとググって試して、

今回は『ファサード』を使う方法で設定する事にしました。

  • ファサード・・玄関という意味。

『Slackファサード』を自作する事で、

コントローラ内で、

Slack::send(‘なんちゃら’);

と入力しておけば、『Slack』側にも通知がいくようになります。

※実際はなんちゃらの箇所は変数で指定しています。

大きく3つのパートに分けて設定しています。

  1. 初期設定
  2. Notification作成
  3. ファサード作成(サービス・ファサード・プロバイダ)

LaravelでSlackに通知する方法 1. 初期設定

まずは初期設定をば。

『Slack』には通知設定用の『webhook(ウェブフック)』という仕組みがあるので、

通知したい『Slackワークスペース』の『webhook URL』を取得します。

Sponsored link

1-1 Slackのwebhook URLを取得

このアドレスにアクセスします。

新規WebHook作成

通知したい『チャンネル』を指定して作成します。

生成された『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 5.8からは Slack Channelをインストールするように変わったようです。

参考記事
LaravelでFacadeを作ってSlackに通知してみた

Sponsored link

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 に追記する

Sponsored link

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

〜中略〜
Sponsored link

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()
    {
        //
    }
}
Sponsored link

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』の管理画面から設定しました。

アオキ
後から気づいたのですが、画像、名前、チャンネルともに管理画面からでも設定できるようです。
Sponsored link

LaravelでSlack通知する方法をまとめてみて

一から『Slack通知』機能をつくろうとするとなかなか大変なんじゃないかと思うのですが、

『Laravel』の色々な機能を組み合わせる事で、

  1. 早い
  2. 見やすい
  3. 修正しやすい

と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】に通知する方法をまとめてみた【自作ファサード】

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. データベース

    MySQLの講座をリリースしました
  2. 生成AI

    2024/5/14 OpenAI発表 まとめ
  3. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
  4. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  5. バックエンド

    【Laravel第4弾】Vue.js3(CompositionAPI+Scrip…
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
100% Free SEO Tools - Tool Kits PRO