はじめに
LaravelのNotificationクラスは「通知」という概念をきれいに切り出すためのものです。
通知といっても、メールだけでなく、SlackやDB保存、外部サービスへのWebhookなど、実際の開発では複数の手段を組み合わせることがよくあります。
本記事では、
Notificationをどんな場面で使うと効果的なのか
といった設計面の話を中心に解説します。
その具体例として、Slack通知の実装を最小構成で紹介します。
※ 本記事は Laravel 11系 を想定しています。
Laravel Notificationとは何か
Laravel Notificationは、「何を通知するか」をクラスとして表現する仕組みです。
例えば「バッチ処理が失敗した」「新しいユーザーが登録された」といった
イベントに対する通知内容を、1つのクラスにまとめて定義できます。
Notificationクラスの役割
Notificationクラスの主な役割は以下の通りです。
- 通知内容をクラスとして表現する
- どのチャネルに通知するかを切り替える
- 同じ通知を複数の手段で送れるようにする
これにより、通知ロジックが分散せず、保守しやすい構成になります
Mailable / Jobとの責務の違い
Notificationと混同しやすいものとして、MailableやJobがあります。
Mailable
メール送信に特化
件名・本文・レイアウトをどう作るかが中心
単一チャネル(メール)の責務
Job
非同期処理そのものを表現
「何をするか」にフォーカス
通知以外の用途も多い
Notification
「何を通知するか」にフォーカス
メール・Slack・DBなど複数チャネルを横断
通知という責務を明確に切り出せる
通知が主目的の場合はNotificationを使う、というのが基本的な考え方です。
Notificationクラスの基本構造
まずは、Slack通知の実装例を提示して、後で各メソッドを紹介します。
Notificationクラスを定義し、送信文面等を設定します。
Notificationクラス作成
php artisan make:notification SlackNotification
# SlackNotificationクラス
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\SlackMessage;
class SlackNotification extends Notification
{
public function via($notifiable)
{
return ['slack'];
}
public function toSlack($notifiable)
{
return (new SlackMessage)
->content('NotificationクラスからSlack通知を送信しています');
}
}
送信処理は下記のようにします。(各コントローラやユースケース)
Notification::route('slack', config('services.slack.webhook_url'))
->notify(new SlackNotification());
Notificationクラスの概要
Notificationクラスは、主に以下のメソッドで構成されます。
via()
public function via($notifiable)
{
return ['mail', 'slack'];
}
- どのチャネルで通知するかを配列で返す
- 条件によってチャネルを切り替えることも可能
toMail() / toSlack() / toXxx()
各チャネルごとに、toXxx() メソッドを実装します。
public function toMail($notifiable)
{
// メール通知の内容
}
public function toSlack($notifiable)
{
// Slack通知の内容
}
- メソッド名はチャネル名に対応
- チャネルごとに送信内容を定義できる
この構造により、通知内容は共通、表現はチャネルごとという設計が可能になります。
次に、送信側です。
Notificationは、基本的に「誰に通知するか」を起点に送信します。
ユーザに通知
# Userなどに通知する場合
# $userはUserモデル
$user->notify(new SampleNotification());
- Userモデルに Notifiable トレイトを使う
- メールアドレスなどをUserが保持する
システム通知(Userに紐づかない通知)
Notification::route('slack', config('services.slack.webhook_url'))
->notify(new SampleNotification());
- バッチ結果
- システムエラー
- 管理者向け通知
Notificationを使うべきケース・使わないケース
使うべきケース
- 同じ通知を複数チャネルで送りたい
- 通知ロジックを一箇所にまとめたい
- Queue前提で非同期に通知したい(NotificationクラスでQueueを使うか定義可能)
使わない方がよいケース
- 単発のメール送信のみ
- 通知というより画面描画やレスポンスが主目的
「通知」という責務が明確ならNotificationを使う、
そうでなければ別の手段を選ぶのが良いです。
まとめ
Notificationクラスは、
通知をアプリケーションの中で適切に整理するための仕組みです。
- 通知内容をクラスとして表現できる
- 複数チャネルを横断できる