Symfonyで独自イベント(カスタムイベント)を作成する方法をやさしく解説
生徒
「Symfonyって、決まったイベントだけ使えるんですか?」
先生
「いいえ、自分でイベントを作ることもできます。これを独自イベント、またはカスタムイベントと呼びます。」
生徒
「自分でイベントを作るって、難しそうです……」
先生
「仕組みを順番に見ていけば大丈夫です。今日はSymfonyで独自イベントを作る方法を一緒に見ていきましょう。」
1. Symfonyの独自イベント(カスタムイベント)とは?
Symfonyの独自イベント(カスタムイベント)とは、開発者が自由なタイミングで発生させられるイベントのことです。イベントとは「ある出来事が起きた」という合図のようなものです。例えば「会員登録が完了した」「商品が購入された」など、アプリケーション独自の出来事をイベントとして扱えます。
Symfonyではイベントとリスナーの仕組みが用意されており、独自イベントを使うことで処理を整理し、読みやすく保守しやすいコードを書くことができます。
2. 独自イベントを使うメリット
独自イベントを使う最大のメリットは、処理を分離できる点です。分離とは、役割ごとに処理を分けることです。例えば、注文処理の中にメール送信やログ保存の処理を直接書くと、コードが長くなり読みにくくなります。
イベントを使えば「注文完了イベント」を発生させ、メール送信やログ保存は別の場所で処理できます。これにより、プログラム全体が整理され、後から修正しやすくなります。
3. 独自イベント用のイベントクラスを作成する
まずはイベントそのものを表すイベントクラスを作成します。イベントクラスは「何が起きたか」と「必要な情報」をまとめた箱のようなものです。
namespace App\Event;
use Symfony\Contracts\EventDispatcher\Event;
class UserRegisteredEvent extends Event
{
public const NAME = 'user.registered';
private string $email;
public function __construct(string $email)
{
$this->email = $email;
}
public function getEmail(): string
{
return $this->email;
}
}
この例では「ユーザー登録が完了した」というイベントを表しています。メールアドレスをイベントに持たせることで、後からリスナーで使えるようになります。
4. イベントを発生(ディスパッチ)させる方法
次に、作成した独自イベントを発生させる処理を書きます。イベントを発生させることを「ディスパッチする」と言います。ディスパッチとは「知らせを送る」という意味です。
use App\Event\UserRegisteredEvent;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class UserService
{
public function register(
string $email,
EventDispatcherInterface $dispatcher
): void {
$event = new UserRegisteredEvent($email);
$dispatcher->dispatch($event, UserRegisteredEvent::NAME);
}
}
このコードでは、ユーザー登録処理の中でイベントを作成し、EventDispatcherを使ってイベントを発生させています。
5. 独自イベントを受け取るリスナーを作成する
イベントが発生したら、それを受け取って処理を行うリスナーを作成します。リスナーは「イベントを聞いて行動する人」のような存在です。
namespace App\EventListener;
use App\Event\UserRegisteredEvent;
class SendWelcomeMailListener
{
public function onUserRegistered(UserRegisteredEvent $event): void
{
$email = $event->getEmail();
// ここでメール送信処理を行う
}
}
このリスナーは、ユーザー登録イベントを受け取り、登録されたメールアドレスを使って処理を行います。
6. services.yamlでリスナーを登録する
作成したリスナーをSymfonyに認識させるため、設定ファイルに登録します。ここではservices.yamlを使います。
services:
App\EventListener\SendWelcomeMailListener:
tags:
- { name: kernel.event_listener, event: 'user.registered', method: onUserRegistered }
この設定により、「user.registered」という独自イベントが発生したときに、このリスナーが呼び出されます。
7. 独自イベントの処理の流れを整理しよう
Symfonyの独自イベントは、次の流れで動きます。まずイベントクラスを作成し、次にイベントをディスパッチします。そして、登録されたリスナーがイベントを受け取り、それぞれの処理を実行します。
この流れを理解すると、処理の追加や変更がしやすくなり、大きなアプリケーションでも混乱しにくくなります。
8. 初心者がつまずきやすいポイント
初心者がつまずきやすいのは、イベント名の書き間違いや、リスナーが正しく登録されていないケースです。また、イベントクラスとリスナーの役割を混同してしまうこともあります。
イベントは「出来事」、リスナーは「それを受けて行う処理」と意識すると、理解しやすくなります。