Symfony - Acara dan EventListener

Symfony menyediakan pemrograman berbasis peristiwa melalui EventDispatcherkomponen. Aplikasi perusahaan apa pun memerlukan pemrograman berbasis peristiwa untuk membuat aplikasi yang sangat dapat disesuaikan. Peristiwa adalah salah satu alat utama objek untuk berinteraksi satu sama lain. Tanpa peristiwa, suatu objek tidak berinteraksi secara efisien.

Proses pemrograman berbasis acara dapat diringkas sebagai - Sebuah objek, disebut Event sourcememinta objek operator pusat untuk mendaftarkan suatu peristiwa, misalnya user.registered. Satu atau beberapa objek, yang disebut listener meminta objek operator pusat yang ingin didengarkannya ke acara tertentu, misalnya user.registered. Di beberapa titik waktu, objek sumber Peristiwa meminta objek operator pusat untuk mengirimkan peristiwa, katakanlah user.registered bersama dengan objek Peristiwa dengan informasi yang diperlukan. Operator pusat memberi tahu semua objek pendengar tentang peristiwa tersebut, misalnya user.registered dan objek Peristiwa *.

Dalam pemrograman berbasis peristiwa, kami memiliki empat jenis objek: Sumber Peristiwa, Pemroses Peristiwa, Bahkan Petugas Operator, dan Peristiwa itu sendiri.

Mari kita tulis aplikasi sederhana untuk memahami konsep tersebut.

Step 1 - Buat proyek, event-dispatcher-example.

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

Step 2 - Buat kelas, .User.

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

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

Step 3 - Buat acara, 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);

Sini, UserRegisteredEvent memiliki akses ke Userobyek. Nama acaranya adalahuser.registered.

Step 4 - Buat pendengar, 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 - Buat objek operator acara.

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

Step 6 - Hubungkan pendengar dan acara menggunakan objek dispatcher dan metodenya, addListener.

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

Kami juga dapat menambahkan fungsi anonim sebagai pendengar acara seperti yang ditunjukkan pada kode berikut.

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

Step 7 - Terakhir, aktifkan / kirim acara menggunakan metode dispatcher acara, dispatch.

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

Daftar kode lengkapnya adalah sebagai berikut.

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

Hasil

Jon 
Jon 
25

Kerangka web Symfony memiliki banyak acara dan seseorang dapat mendaftarkan pendengar untuk acara tersebut dan memprogramnya sesuai dengan itu. Salah satu contoh kejadian adalah kernel.exception dan kejadian terkait adalahGetResponseForExceptionEvent, yang menampung objek respons (keluaran dari permintaan web). Ini digunakan untuk menangkap pengecualian dan mengubah respons dengan informasi kesalahan umum alih-alih menampilkan kesalahan waktu proses kepada pengguna.