Symfony - Sự kiện và EventListener

Symfony cung cấp chương trình dựa trên sự kiện thông qua EventDispatcherthành phần. Bất kỳ ứng dụng doanh nghiệp nào cũng cần lập trình dựa trên sự kiện để tạo ra một ứng dụng có khả năng tùy biến cao. Sự kiện là một trong những công cụ chính để các đối tượng tương tác với nhau. Không có sự kiện, một đối tượng không tương tác hiệu quả.

Quá trình lập trình dựa trên sự kiện có thể được tóm tắt là - Một đối tượng, được gọi là Event sourceyêu cầu đối tượng điều phối trung tâm đăng ký một sự kiện, chẳng hạn như user.registered. Một hoặc nhiều đối tượng, được gọi là bộ lắng nghe hỏi đối tượng điều phối trung tâm rằng nó muốn lắng nghe một sự kiện cụ thể, chẳng hạn như user.registered. Tại một số thời điểm, đối tượng nguồn Sự kiện yêu cầu đối tượng điều phối trung tâm gửi sự kiện, chẳng hạn như user.registered cùng với đối tượng Sự kiện với thông tin cần thiết. Bộ điều phối trung tâm thông báo cho tất cả các đối tượng người nghe về sự kiện, chẳng hạn như user.registered và đối tượng Event * của nó.

Trong lập trình dựa trên sự kiện, chúng ta có bốn loại đối tượng: Nguồn sự kiện, Trình xử lý sự kiện, Bộ điều phối thậm chí và bản thân Sự kiện.

Hãy để chúng tôi viết một ứng dụng đơn giản để hiểu khái niệm.

Step 1 - Tạo một dự án, event-dispatcher-example.

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

Step 2 - Tạo một lớp học, .User.

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

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

Step 3 - Tạo một sự kiện, 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);

Đây, UserRegisteredEvent có quyền truy cập vào Uservật. Tên của sự kiện làuser.registered.

Step 4 - Tạo người nghe, 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 - Tạo đối tượng điều phối sự kiện.

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

Step 6 - Kết nối người nghe và sự kiện bằng cách sử dụng đối tượng điều phối và phương thức của nó, addListener.

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

Chúng ta cũng có thể thêm một hàm ẩn danh làm trình xử lý sự kiện như được hiển thị trong đoạn mã sau.

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

Step 7 - Cuối cùng, kích hoạt / điều phối sự kiện bằng phương pháp của người điều phối sự kiện, dispatch.

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

Danh sách mã hoàn chỉnh như sau.

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

Kết quả

Jon 
Jon 
25

Khung công tác web Symfony có rất nhiều sự kiện và người ta có thể đăng ký người nghe cho các sự kiện đó và lập trình nó cho phù hợp. Một trong những sự kiện mẫu là kernel.exception và sự kiện tương ứng làGetResponseForExceptionEvent, chứa đối tượng phản hồi (đầu ra của một yêu cầu web). Điều này được sử dụng để bắt ngoại lệ và sửa đổi phản hồi với thông tin lỗi chung thay vì hiển thị lỗi thời gian chạy cho người dùng.