bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. Laravel の Event / Listener で Pub/Sub を実装する

Laravel の Event / Listener で Pub/Sub を実装する

Apr 2, 2026 Laravel , PHP bucket-sort

以前の記事で Pub/Sub パターンの概念と C# での実装例を紹介しました。Laravel にはこのパターンをフレームワークレベルで実現する Event / Listener の仕組みが標準で備わっています。

この記事では、Pub/Sub の概念を Laravel に当てはめながら整理します。

Pub/Sub との対応関係

Pub/Sub パターンとの対応を先に確認しておきます。

Pub/Sub の概念 Laravel での対応
Publisher(発行者) Event::dispatch() を呼ぶ場所(Controller や Service など)
Broker(仲介者) Laravel のイベントシステム(自動で仲介)
Subscriber(購読者) Listener クラス
メッセージ Event クラス

自前で Broker を実装していた部分を Laravel が肩代わりしてくれる形です。

Event クラスの作成

artisan でひな形を生成します。

php artisan make:event OrderPlaced

生成されるクラスに、イベントが運ぶデータをプロパティとして持たせます。

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderPlaced
{
    use Dispatchable, SerializesModels;

    public function __construct(
        public readonly int $orderId,
        public readonly string $productName,
    ) {}
}

Event クラスは純粋なデータコンテナです。ロジックは持ちません。

Listener クラスの作成

受け取り側も artisan で生成します。

php artisan make:listener SendOrderNotification --event=OrderPlaced
php artisan make:listener LogOrderActivity     --event=OrderPlaced

handle() メソッドにイベントが渡されてきます。

namespace App\Listeners;

use App\Events\OrderPlaced;

class SendOrderNotification
{
    public function handle(OrderPlaced $event): void
    {
        // メール送信などの処理
        \Log::info("[Mail] 注文確認: {$event->productName} (ID: {$event->orderId})");
    }
}
namespace App\Listeners;

use App\Events\OrderPlaced;

class LogOrderActivity
{
    public function handle(OrderPlaced $event): void
    {
        \Log::info("[Log] 注文受付: {$event->productName} (ID: {$event->orderId})");
    }
}

Event と Listener の登録

EventServiceProvider に対応関係を定義します。

namespace App\Providers;

use App\Events\OrderPlaced;
use App\Listeners\LogOrderActivity;
use App\Listeners\SendOrderNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        OrderPlaced::class => [
            SendOrderNotification::class,
            LogOrderActivity::class,
        ],
    ];
}

1つのイベントに対して複数の Listener を登録できます。Publisher はここに何が登録されているかを知りません。

Event の発行

登録が済んだら、発行側のコードは非常にシンプルです。

use App\Events\OrderPlaced;

class OrderController extends Controller
{
    public function store(StoreOrderRequest $request): RedirectResponse
    {
        $order = Order::create($request->validated());

        // イベントを発行する
        OrderPlaced::dispatch($order->id, $order->product_name);

        return redirect()->route('orders.index');
    }
}

dispatch() を呼ぶだけで、登録されているすべての Listener が動きます。Controller は Listener の存在を知りません。

非同期処理(キュー)への対応

Listener に ShouldQueue インターフェースを実装するだけで、そのリスナーの処理をキューに流せます。

use Illuminate\Contracts\Queue\ShouldQueue;

class SendOrderNotification implements ShouldQueue
{
    public string $queue = 'notifications';

    public function handle(OrderPlaced $event): void
    {
        // キューワーカーが非同期で処理する
    }
}

メール送信や外部 API 呼び出しなど、レスポンスを遅らせたくない処理をキューに回す場合に使います。ShouldQueue をつけない Listener は同期実行されます。

まとめ

  • Laravel の Event / Listener は Pub/Sub パターンの公式実装
  • Event クラス → メッセージ(データコンテナ)
  • Listener クラス → Subscriber(処理の担い手)
  • EventServiceProvider が Broker の役割を担い、対応関係を管理する
  • ShouldQueue を実装するだけで非同期処理に切り替えられる

Controller や Service に処理を直接書き続けると肥大化しやすいですが、Event / Listener を使うことで「何かが起きた → 必要な処理が動く」という形に整理できます。Pub/Sub の概念を知っていると、この仕組みがなぜこの形になっているのかが見えやすくなります。

Laravel PHP デザインパターン
← [C#] delegate と event の仕組みを整理する

Related Posts

  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026
  • Laravelのレート制限(throttle:5,1)とは何か Mar 27, 2026
  • Livewireのファイルアップロード一時ファイルは誰が掃除しているのか Mar 14, 2026

Table of Contents

  • Pub/Sub との対応関係
  • Event クラスの作成
  • Listener クラスの作成
  • Event と Listener の登録
  • Event の発行
  • 非同期処理(キュー)への対応
  • まとめ

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.