Appearance
イベントとリスナー ― 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に聞く前に、自分の頭で考えてみましょう。
テキストを入力すると有効になります