Symfony-イベントとEventListener

Symfonyは、そのを通じてイベントベースのプログラミングを提供します EventDispatcher成分。高度にカスタマイズ可能なアプリケーションを作成するには、エンタープライズアプリケーションにはイベントベースのプログラミングが必要です。イベントは、オブジェクトが相互作用するための主要なツールの1つです。イベントがないと、オブジェクトは効率的に相互作用しません。

イベントベースのプログラミングのプロセスは、次のように要約できます。 Event source中央ディスパッチャオブジェクトに、user.registeredなどのイベントを登録するように要求します。リスナーと呼ばれる1つ以上のオブジェクトが、中央のディスパッチャオブジェクトに、特定のイベント(user.registeredなど)をリッスンするように要求します。ある時点で、イベントソースオブジェクトは中央ディスパッチャオブジェクトにイベントをディスパッチするように要求します。たとえば、user.registeredは、必要な情報を含むイベントオブジェクトと一緒に送信します。中央ディスパッチャは、user.registeredとそのEvent *オブジェクトなど、すべてのリスナーオブジェクトにイベントについて通知します。

イベントベースのプログラミングでは、イベントソース、イベントリスナー、偶数ディスパッチャー、およびイベント自体の4種類のオブジェクトがあります。

概念を理解するための簡単なアプリケーションを書いてみましょう。

Step 1 −プロジェクトを作成し、 event-dispatcher-example

cd /path/to/dir 
mkdir event-dispatcher-example 
cd event-dispatcher-example 
composer require symfony/event-dispatcher

Step 2 −クラスを作成し、 .User

class User { 
   public $name; 
   public $age; 
}  

$user = new User(); 
$user->name = "Jon"; 
$user->age = 25

Step 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

Step 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();

Step 5 −イベントディスパッチャオブジェクトを作成します。

use Symfony\Component\EventDispatcher\EventDispatcher;  
$dispatcher = new EventDispatcher();

Step 6 −ディスパッチャオブジェクトとそのメソッドを使用してリスナーとイベントを接続します。 addListener

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      array($listener, 'onUserRegistrationAction'));

次のコードに示すように、イベントリスナーとして無名関数を追加することもできます。

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      
      function(Event $event) { 
         $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
      });

Step 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要求の出力)を保持します。これは、実行時エラーをユーザーに表示する代わりに、例外をキャッチし、一般的なエラー情報で応答を変更するために使用されます。