2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Laravel] Notificationの基本と実装例

2
Posted at

はじめに

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を使うべきケース・使わないケース

使うべきケース

  1. 同じ通知を複数チャネルで送りたい
  2. 通知ロジックを一箇所にまとめたい
  3. Queue前提で非同期に通知したい(NotificationクラスでQueueを使うか定義可能)

使わない方がよいケース

  1. 単発のメール送信のみ
  2. 通知というより画面描画やレスポンスが主目的

「通知」という責務が明確ならNotificationを使う、
そうでなければ別の手段を選ぶのが良いです。

まとめ

Notificationクラスは、
通知をアプリケーションの中で適切に整理するための仕組みです。

  • 通知内容をクラスとして表現できる
  • 複数チャネルを横断できる
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?