EventDispatcher:疎結合なイベント
SymfonyのEventDispatcherを使ってイベントをディスパッチ・リッスンします
「EventDispatcher:疎結合なイベント」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
EventDispatcherとは
Symfony EventDispatcherはObserverパターンを実装しています。コードがイベントをディスパッチし、リスナーがそれに応答します。ディスパッチャーはリスナーについて何も知る必要がありません。
インストール
コンポーネントをインストールします。
$ composer require symfony/event-dispatcherイベントの作成
イベントは通常のPHPクラスであり、多くの場合Eventを継承し(任意)、データを保持します。
<?php
use Symfony\Contracts\EventDispatcher\Event;
class UserRegisteredEvent extends Event
{
public const NAME = "user.registered";
public function __construct(public readonly User $user) {}
}リスナーの作成
リスナーは、特定のイベントに応答するcallableまたはオブジェクトです。
<?php
class SendWelcomeEmailListener
{
public function __invoke(UserRegisteredEvent $event): void
{
mail($event->user->email, "Welcome!", "Thanks for joining!");
}
}リスナーの登録
リスナーをディスパッチャーに追加します。
<?php
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
$dispatcher->addListener(
UserRegisteredEvent::NAME,
new SendWelcomeEmailListener()
);イベントのディスパッチ
イベントをディスパッチすると、登録されているすべてのリスナーが優先度の順に呼び出されます。
<?php
$user = new User("alice@example.com");
$dispatcher->dispatch(new UserRegisteredEvent($user), UserRegisteredEvent::NAME);リスナーの優先度
addListener()の第3引数として優先度を表す整数を渡します。数値が大きいものから先に実行されます(デフォルト:0)。
<?php
$dispatcher->addListener("user.registered", $logListener, 10); // runs first
$dispatcher->addListener("user.registered", $emailListener, 0); // runs secondイベントサブスクライバー
イベントサブスクライバーは、EventSubscriberInterfaceを実装して自身のリスナーを登録するクラスです。
<?php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array {
return [
UserRegisteredEvent::NAME => "onUserRegistered",
];
}
public function onUserRegistered(UserRegisteredEvent $event): void {
// ...
}
}伝播の停止
リスナー内で$event->stopPropagation()を呼び出すと、後続のリスナーが実行されないようにできます。
Laravelでの利用
Laravelには独自のイベントシステムがあります。event(new UserRegistered($user))でディスパッチします。EventServiceProviderにリスナーを登録するか、#[Listen]属性を使用します。
イベント駆動アーキテクチャの利点
イベントによってコンポーネントが疎結合になります。登録サービスがメールサービスをインポートする必要はありません。既存のコードを変更せず、新しいリスナーを登録するだけで、ロギングや分析などの新しい動作を追加できます。
まとめ
データを持つイベントクラスを作成し、addListener()でリスナーを追加し、$dispatcher->dispatch()でディスパッチします。リスナーのグループを自身で登録する場合はサブスクライバーを使用します。
理解度チェック
後続のリスナーが実行されないようにするには、どうすればよいですか?
よくある質問
「EventDispatcher:疎結合なイベント」レッスンは無料ですか?
はい。「EventDispatcher:疎結合なイベント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「EventDispatcher:疎結合なイベント」で何を学びますか?
SymfonyのEventDispatcherを使ってイベントをディスパッチ・リッスンします ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「EventDispatcher:疎結合なイベント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HttpFoundation:リクエストとレスポンス
- DependencyInjectionコンテナ
- EventDispatcher:疎結合なイベント
- Consoleコンポーネント:CLIコマンド