Laravel通知機能を徹底解説!メール・データベース・Slackへ同時送信する方法
生徒
「Laravelを使って、ユーザーが会員登録したときにメールとサイト内の通知、さらに運営へのSlack連絡を一度に行いたいのですが、そんな便利な方法はありますか?」
先生
「ありますよ!Laravelの『Notification(通知)』という機能を使えば、一つの命令で複数のルートにメッセージを飛ばすことが可能です。」
生徒
「それぞれ別々にプログラムを書かなくていいんですね!具体的にはどうやって設定するのでしょうか?」
先生
「初心者の方でも順を追えば大丈夫です。まずは基本の仕組みから一緒に見ていきましょう!」
1. Laravelの通知機能(Notification)とは?
LaravelのNotification(通知)機能とは、アプリケーションからユーザーに対して、何らかの出来事をお知らせするための仕組みです。例えば「注文が完了しました」「メッセージが届きました」といった情報を、さまざまな手段で伝えることができます。
この機能の素晴らしい点は、「何を伝えるか」という内容と、「どうやって伝えるか」という経路(チャネル)を分けて管理できることです。パソコンに詳しくない方のために例えると、通知機能は「郵便局」のようなものです。手紙の内容(メッセージ)を一つ用意すれば、それをハガキ(メール)で送るか、電報(Slack)で送るか、あるいは掲示板(データベース)に貼るかを、郵便局側で振り分けてくれるイメージです。
プログラミング未経験の方にとって、複数の送り先を制御するのは難しそうに感じるかもしれませんが、Laravelでは一つの専用ファイルを作るだけで、これらをまとめて操作できるようになります。
2. 通知クラスを作成して土台を作ろう
まずは、通知の「設計図」となるクラスを作成します。Laravelでは、コマンド入力画面(ターミナルやコマンドプロンプト)で専用の命令を打ち込むだけで、自動的に必要なファイルが作成されます。この設計図があるおかげで、どこに何を記述すべきかが明確になります。
以下のコマンドを実行すると、app/Notificationsというフォルダの中に、新しい通知用ファイルが出来上がります。今回は「会員登録完了」を知らせる通知を作ってみましょう。
// ターミナルで実行するコマンド
php artisan make:notification WelcomeNotification
このコマンドを実行することで、通知を送るための準備が整います。クラスというのは、プログラムにおける「型」や「テンプレート」のようなものだと考えてください。一度作っておけば、何度でも使い回すことができます。
3. viaメソッドで送信先チャネルを指定する
作成された通知ファイルの中には、viaという名前のメソッド(処理のまとまり)があります。これが非常に重要です。ここで「どの手段を使って通知を届けるか」を決定します。
複数のチャネルに同時送信したい場合は、このviaメソッドの戻り値として、配列形式でチャネル名を並べるだけです。例えば、メールとデータベース、そしてSlackに送りたい場合は、以下のように記述します。
public function via($notifiable)
{
// 送信先を配列で指定するだけで同時送信が可能になります
return ['mail', 'database', 'slack'];
}
ここで出てくる$notifiableという言葉は、「通知を受け取る対象(主にユーザー)」を指します。この一行を書くだけで、Laravelは「よし、この通知はメールとデータベースとSlackの三箇所に送るんだな」と理解してくれます。プログラミングの難しい制御を自分でする必要がないのが、Laravelの強みです。
4. 各チャネルごとのメッセージ内容を設定する
送信先を決めたら、次はそれぞれのチャネルで「どんなメッセージを送るか」を定義します。メール用ならtoMail、データベース用ならtoArray(またはtoDatabase)というメソッドを使います。各チャネルごとに専用の窓口が用意されていると考えてください。
例えば、メールの内容をカスタマイズする場合は、以下のように記述します。直感的な英語のような命令が並んでいるので、英語が苦手な方でもなんとなく「挨拶(greeting)」「一行(line)」「ボタン(action)」を設定していることがわかるはずです。
public function toMail($notifiable)
{
return (new MailMessage)
->subject('ご登録ありがとうございます!')
->greeting('こんにちは!')
->line('サイトへの会員登録が完了しました。')
->action('マイページへ', url('/home'))
->line('これからもよろしくお願いいたします!');
}
このように、送信先ごとに最適な見せ方を設定できるため、ユーザーにとっても分かりやすい通知を届けることが可能になります。
5. データベース通知のためのテーブル準備
「データベースに通知を送る」とは、サイト内の「お知らせ一覧」などに表示するために、通知内容を保存しておくことを指します。これを行うには、通知を保存するための専用の「箱(テーブル)」をデータベース内に作る必要があります。
これもLaravelならコマンド一つで準備できます。以下の手順で進めていきましょう。データベースとは、情報を整理して保管しておく巨大な棚のようなものです。そこに「通知専用の棚」を追加する作業です。
// 通知保存用のテーブルを作成するための準備
php artisan notifications:table
// 実際にデータベースにテーブルを反映させる
php artisan migrate
migrate(マイグレート)という言葉は、直訳すると「移住させる」という意味ですが、プログラミングの世界では「設計図を実際のデータベースに反映させる」という意味で使われます。これで、サイト内に通知履歴を残す準備が完了しました。
6. 通知を実際に送信するプログラムの書き方
全ての準備が整ったら、いよいよ通知を送信します。送信する方法はいくつかありますが、最も一般的なのは、ユーザー情報を管理しているモデル(Userモデル)のnotifyメソッドを呼び出す方法です。
以下のコードは、現在ログインしているユーザーに対して、先ほど作成した通知を送信する例です。たった一行のコードで、メール送信、データベース保存、Slack連携がバックグラウンドで一斉に動き出します。
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Auth;
// ログイン中のユーザーを取得
$user = Auth::user();
// 通知を送信(これでmail, database, slack全てに送られます)
$user->notify(new WelcomeNotification());
実行結果として、エラーが出なければ成功です。もし、メールの設定が正しくできていれば数秒後にメールが届き、データベースを確認すれば新しい通知データが追加されているはずです。
// 送信後の状態イメージ
メール:受信トレイに「ご登録ありがとうございます」が届く
データベース:notificationsテーブルに1件データが増える
Slack:指定したチャンネルにメッセージが表示される
7. Slack通知を連携させるためのポイント
Slackへ通知を送るには、少しだけ追加の設定が必要です。Slack側の設定画面で「Incoming Webhook」というURLを発行し、それをLaravel側に教えてあげる必要があります。また、専用の拡張パッケージ(道具箱)をインストールすることもあります。
具体的には、Userモデルの中に「Slackのどこに送るか」という宛先を書くためのメソッドを追加します。初心者の方は「外部のサービスと連携するときは、鍵となるURLが必要なんだな」という認識で今は十分です。
このようにLaravelは、外部のチャットツールとも親和性が高く、開発者が一つ一つ複雑な通信プログラムを書かなくても済むように設計されています。これが「世界中でLaravelが愛されている理由」の一つでもあります。
8. 複数チャネルを使い分けるメリット
なぜ、わざわざ複数のチャネルに同時送信するのでしょうか?それは、ユーザーの利便性を高めるためです。メールは後で見返すのに適していますが、リアルタイムの気付きには弱い面があります。一方で、サイト内通知(データベース)はログイン中にすぐに気づけますし、Slackは運営チームが素早く状況を把握するのに最適です。
Laravelの通知機能を使えば、後から「やっぱりLINEでも送りたいな」と思ったときも、設計図(通知クラス)のviaメソッドに一つ項目を増やすだけで対応できます。プログラム全体を書き直す必要がないため、メンテナンスが非常に楽になります。これを拡張性が高いと言います。初心者の方は、まず「Laravelなら色々な送り先を簡単にまとめられる!」という点だけをしっかり覚えておきましょう。