Skip to content

イベントとリスナー ― 1つが壊れたら残りは?

📖この章のキーワード
用語意味なぜ重要か
Event(イベント)「何かが起きた」を表すオブジェクトFriendAdded, OrderPlaced 等
Listener(リスナー)イベントを受け取って処理するクラスメール送信、ログ記録 等
疎結合コンポーネント間の依存が弱い状態リスナーの追加/削除が発火元に影響しない
Observer パターン状態変化を監視して通知する設計パターンイベント駆動の基礎

Phase 1: 観察

Ch 5.1 の FollowEvent は最後に event(new FriendAdded($friend)) を呼んでいました。

php
// FriendAdded.php
// Label: exemplar

class FriendAdded implements ShouldBroadcast
{
    public function __construct(
        private Friend $friend,
    ) {}

    public function broadcastOn(): array
    {
        return [new Channel('friend-added')];
    }

    public function broadcastWith(): array
    {
        return [
            'friendName' => $this->friend->name,
            'timestamp' => now()->toIso8601String(),
        ];
    }
}

このイベントに複数のリスナーが登録されていたとしましょう。


Phase 2: 判断

AI禁止ゾーン

FriendAdded イベントに 3 つのリスナーが登録されているとします。

php
// EventServiceProvider
FriendAdded::class => [
    SendWelcomeNotification::class,     // リスナー A
    UpdateAnalyticsDashboard::class,    // リスナー B
    SyncWithExternalCRM::class,         // リスナー C(外部API呼び出し)
];
  • リスナー B が 例外を投げたら、リスナー C は実行されますか?
  • 全リスナーを ShouldQueue にしたら、何が変わりますか?
  • イベント駆動の デメリット は何ですか?

AIに聞く前に、自分の頭で考えてみましょう。

テキストを入力すると有効になります