Symfony - Events und EventListener

Symfony bietet ereignisbasierte Programmierung über seine EventDispatcherKomponente. Jede Unternehmensanwendung benötigt eine ereignisbasierte Programmierung, um eine hochgradig anpassbare Anwendung zu erstellen. Ereignisse sind eines der Hauptwerkzeuge für die Interaktion der Objekte miteinander. Ohne Ereignisse interagiert ein Objekt nicht effizient.

Der Prozess der ereignisbasierten Programmierung kann wie folgt zusammengefasst werden: - Ein Objekt, das aufgerufen wird Event sourcefordert das zentrale Dispatcher-Objekt auf, ein Ereignis zu registrieren, z. B. user.registered. Ein oder mehrere Objekte, Listener genannt, fragen das zentrale Dispatcher-Objekt, ob es ein bestimmtes Ereignis abhören möchte, z. B. user.registered. Zu einem bestimmten Zeitpunkt fordert das Ereignisquellenobjekt das zentrale Dispatcherobjekt auf, das Ereignis auszulösen, z. B. user.registered zusammen mit einem Ereignisobjekt mit den erforderlichen Informationen. Der zentrale Dispatcher informiert alle Listener-Objekte über das Ereignis, z. B. user.registered und sein Event * -Objekt.

In der ereignisbasierten Programmierung gibt es vier Arten von Objekten: Ereignisquelle, Ereignis-Listener, Even Dispatcher und das Ereignis selbst.

Lassen Sie uns eine einfache Anwendung schreiben, um das Konzept zu verstehen.

Step 1 - Erstellen Sie ein Projekt, event-dispatcher-example.

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

Step 2 - Erstellen Sie eine Klasse, .User.

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

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

Step 3 - Erstellen Sie ein Ereignis, 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);

Hier, UserRegisteredEvent hat Zugriff auf UserObjekt. Der Name der Veranstaltung istuser.registered.

Step 4 - Erstellen Sie einen Listener, 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 - Erstellen Sie ein Event Dispatcher-Objekt.

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

Step 6 - Verbinden Sie Listener und Ereignis mit dem Dispatcher-Objekt und seiner Methode. addListener.

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

Wir können auch eine anonyme Funktion als Ereignis-Listener hinzufügen, wie im folgenden Code gezeigt.

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

Step 7 - Zum Schluss das Ereignis mit der Methode des Ereignis-Dispatchers auslösen / auslösen. dispatch.

$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);

Die vollständige Codeliste lautet wie folgt.

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); 
?>

Ergebnis

Jon 
Jon 
25

Symfony Web Framework hat viele Ereignisse und man kann den Listener für diese Ereignisse registrieren und entsprechend programmieren. Eines der Beispielereignisse ist kernel.exception und das entsprechende Ereignis istGetResponseForExceptionEvent, das das Antwortobjekt enthält (die Ausgabe einer Webanforderung). Dies wird verwendet, um die Ausnahme abzufangen und die Antwort mit allgemeinen Fehlerinformationen zu ändern, anstatt den Benutzern einen Laufzeitfehler anzuzeigen.