0Pricing
PHP Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HttpFoundation:リクエストとレスポンス
  2. DependencyInjectionコンテナ
  3. EventDispatcher:疎結合なイベント
  4. Consoleコンポーネント:CLIコマンド
← PHP Academyに戻る