PHP
Laravel

Laravel の Listener, Subscriber, Observer それぞれの使い分けについてざっくり


この記事について

Laravel にはイベントを捕捉する仕組みがいくつかあるんですが、まとめて違いや使い方を説明してるページがないな、と思ったので、本当にざっくりですが、書いてみました。


Listener

単体のイベントを捕捉する

Providers/EventServiceProvider.php

protected $listen = [

Event::class => [
Listener::class,
],
];

呼び方

event(new Event($something));


Subscriber

複数のイベントを捕捉する - 何らかの共通の処理を挟んだりするときに有用

Providers/EventServiceProvider.php

protected $subscribe = [

Subscriber::class,
];

Subscriber.php

public function subscribe($events): void

{
$events->listen(FooEvent::class, 'App\Listeners\Subscriber@handleFoo');
$events->listen(BarEvent::class, 'App\Listeners\Subscriber@handleBar');
}

呼び方

event(new FooEvent($something));


Observer

特定のモデルのイベントを捕捉する - モデルの変化にシームレスに追従して何らかの処理を行いたいときに有用

AppServiceProvider.php

SomeModel::observe(SomeModelObserver::class);

明示的にイベントを発火する必要はなく、それぞれのイベントがしかるべきタイミングで勝手に呼ばれます。

デフォルトで捕捉してくれるイベントは下記の13個

HasEvents.php

    public function getObservableEvents()

{
return array_merge(
[
'retrieved', 'creating', 'created', 'updating', 'updated',
'saving', 'saved', 'restoring', 'restored', 'replicating',
'deleting', 'deleted', 'forceDeleted',
],
$this->observables
);
}

setObservableEvents, addObservableEvents, removeObservableEvents あたりをつかって増やしたり減らしたりできます。 getObservableEvents() が呼ばれる前に使ってください。


おまけ: ワイルドカード Listener

イベント名のプレフィックスを使ってマッチしたイベントを捕捉する

Event::listen('message.*', function ($event, $payload) {

// handle event with prefix 'message.'
});

通常は、

event(new MessageSent());

のようにオブジェクトを渡しますが、ワイルドカードを使う場合は、

event('message.sent', ['message' => 'hi']);

のように、イベント名を表す文字列で発火させるようにします。


まとめ


  • Listener: 単独のイベント

  • Subscriber: 複数の関連したイベント

  • Observer: モデルのイベント

  • ワイルドカード Listener: 共通で処理したいイベント