Symfony-events-eventlistener
symfony-イベントとEventListener
symfonyは、 EventDispatcher コンポーネントを通じてイベントベースのプログラミングを提供します。 エンタープライズアプリケーションでは、高度にカスタマイズ可能なアプリケーションを作成するために、イベントベースのプログラミングが必要です。 イベントは、オブジェクトが相互作用するための主要なツールの1つです。 イベントがないと、オブジェクトは効率的に相互作用しません。
イベントベースのプログラミングのプロセスは、次のように要約できます。 Event source というオブジェクトは、中央ディスパッチャオブジェクトに、user.registeredなどのイベントを登録するように要求します。 リスナーと呼ばれる1つ以上のオブジェクトは、user.registeredなどの特定のイベントをリッスンすることを中央ディスパッチャオブジェクトに要求します。 ある時点で、イベントソースオブジェクトは中央のディスパッチャオブジェクトにイベントをディスパッチするように要求します。たとえば、user.registeredは、必要な情報を備えたイベントオブジェクトとともに送信します。 中央ディスパッチャは、すべてのリスナーオブジェクトにイベントについて通知します。たとえば、user.registeredとそのEvent *オブジェクトです。
イベントベースのプログラミングでは、イベントソース、イベントリスナー、イベントディスパッチャー、およびイベント自体の4つのタイプのオブジェクトがあります。
概念を理解するための簡単なアプリケーションを作成しましょう。
ステップ1 *-プロジェクト、 *event-dispatcher-example を作成します。
cd/path/to/dir
mkdir event-dispatcher-example
cd event-dispatcher-example
composer require symfony/event-dispatcher
ステップ2 *-クラス *.User を作成します。
class User {
public $name;
public $age;
}
$user = new User();
$user->name = "Jon";
$user->age = 25
ステップ3 *-イベント、 *UserRegisteredEvent を作成します。
use Symfony\Component\EventDispatcher\Event;
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user;
public function __construct(User $user) {
$this-<user = $user;
}
public function getUser() {
return $this-<user;
}
}
$event = new UserRegisteredEvent($user);
ここで、 UserRegisteredEvent は User オブジェクトにアクセスできます。 イベントの名前は user.registered です。
ステップ4 *-リスナー *UserListener を作成します。
class UserListener {
public function onUserRegistrationAction(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
echo $user->age . "\r\n";
}
}
$listener = new UserListener();
- ステップ5 *-イベントディスパッチャオブジェクトを作成します。
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
ステップ6 *-ディスパッチャーオブジェクトとそのメソッド *addListener を使用して、リスナーとイベントを接続します。
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
array($listener, 'onUserRegistrationAction'));
次のコードに示すように、匿名関数をイベントリスナーとして追加することもできます。
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
});
ステップ7 *-最後に、イベントディスパッチャーのメソッド *dispatch を使用して、イベントを起動/ディスパッチします。
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
完全なコードリストは次のとおりです。
main.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
class User {
public $name;
public $age;
}
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user;
public function __construct(User $user) {
$this->user = $user;
}
public function getUser() {
return $this->user;
}
}
class UserListener {
public function onUserRegistrationAction(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
echo $user->age . "\r\n";
}
}
$user = new User();
$user->name = "Jon";
$user->age = 25;
$event = new UserRegisteredEvent($user);
$listener = new UserListener();
$dispatcher = new EventDispatcher();
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
});
$dispatcher
->addListener(
UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
?>
結果
Jon
Jon
25
symfony Webフレームワークには多くのイベントがあり、それらのイベントのリスナーを登録し、それに応じてプログラムできます。 サンプルイベントの1つはkernel.exceptionであり、対応するイベントは GetResponseForExceptionEvent であり、応答オブジェクト(Web要求の出力)を保持します。 これは、ユーザーにランタイムエラーを表示する代わりに、例外をキャッチし、一般的なエラー情報で応答を変更するために使用されます。