Zend Framework - Trình quản lý sự kiện

Tất cả các ứng dụng hiện đại cần các thành phần sự kiện chắc chắn và linh hoạt. Zend Framework cung cấp một thành phần như vậy,zend-eventmanager. Zend-eventmanager giúp thiết kế kiến ​​trúc cấp cao và hỗ trợ mô hình chủ thể / người quan sát và lập trình hướng khía cạnh.

Cài đặt Trình quản lý sự kiện

Trình quản lý sự kiện có thể được cài đặt bằng cách sử dụng Composer như được chỉ định bên dưới -

composer require zendframework/zend-eventmanager

Các khái niệm về Trình quản lý sự kiện

Các khái niệm cốt lõi của người quản lý sự kiện như sau:

  • Event - Sự kiện là hành động được đặt tên tùy ý, nói greet.

  • Listener- Bất kỳ lệnh gọi lại PHP nào. Chúng được đính kèm với các sự kiện và được gọi khi sự kiện được kích hoạt. Chữ ký mặc định của Listener là -

function(EventInterface $e)
  • EventInterface Class- Được sử dụng để chỉ định chính sự kiện. Nó có các phương thức để thiết lập và lấy thông tin sự kiện như tên (set / getName), target (get / setTarget) và tham số (get / setParams).

  • EventManager class- Phiên bản của EventManager theo dõi tất cả các sự kiện được xác định trong một ứng dụng và các trình nghe tương ứng của nó. EventManager cung cấp một phương thức,attach để đính kèm người nghe vào một sự kiện và nó cung cấp một phương pháp, triggerđể kích hoạt bất kỳ sự kiện nào được xác định trước. Sau khi kích hoạt được gọi, EventManager sẽ gọi trình nghe gắn liền với nó.

  • EventManagerAwareInterface- Đối với một lớp hỗ trợ lập trình dựa trên sự kiện, nó cần triển khai EventManagerAwareInterface. Nó cung cấp hai phương pháp,setEventManagergetEventManager để lấy và đặt trình quản lý sự kiện.

Thí dụ

Hãy để chúng tôi viết một ứng dụng bảng điều khiển PHP đơn giản để hiểu khái niệm trình quản lý sự kiện. Làm theo các bước dưới đây.

  • Tạo một thư mục "eventapp".

  • Tải về zend-eventmanager sử dụng trình soạn nhạc.

  • Tạo một tệp PHP Greeter.php bên trong thư mục "eventapp".

  • Tạo lớp học Greeter và thực hiện EventManagerAwareInterface.

require __DIR__ . '/vendor/autoload.php'; 
class Greeter implements EventManagerAwareInterface { 
   // code 
}

Đây, require được sử dụng để tự động tải tất cả các thành phần đã cài đặt của trình soạn nhạc.

Viết setEventManager phương pháp trong lớp Greeter như hình dưới đây -

public function setEventManager(EventManagerInterface $events) { 
   $events->setIdentifiers([ __CLASS__, get_called_class(),]); $this->events = $events; return $this; 
}

Phương thức này đặt lớp hiện tại thành trình quản lý sự kiện đã cho (đối số $ sự kiện) và sau đó đặt trình quản lý sự kiện trong biến cục bộ $events.

Bước tiếp theo là viết getEventManager phương pháp trong lớp Greeter như hình dưới đây -

public function getEventManager() { 
   if (null === $this->events) { $this->setEventManager(new EventManager()); 
   } 
   return $this->events; 
}

Phương thức này lấy trình quản lý sự kiện từ một biến cục bộ. nếu nó không có sẵn, thì nó sẽ tạo một thể hiện của trình quản lý sự kiện và trả về nó.

Viết một phương thức, greet, Trong lớp Greeter.

public function greet($message) { 
   printf("\"%s\" from class\n", $message); $this->getEventManager()->trigger(__FUNCTION__, $this, $message ]); 
}

Phương thức này nhận trình quản lý sự kiện và kích hoạt / kích hoạt các sự kiện gắn liền với nó.

Bước tiếp theo là tạo một phiên bản của Greeter và đính kèm một trình lắng nghe vào phương thức của nó, greet.

$greeter = new Greeter(); $greeter->getEventManager()->attach('greet', function($e) { $event_name = $e->getName(); $target_name = get_class($e->getTarget()); $params_json = json_encode($e->getParams()); printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n", $event_name,  
      $target_name, $params_json); 
});

Trình nghe gọi lại chỉ in tên của sự kiện, mục tiêu và các tham số được cung cấp.

Danh sách đầy đủ của Greeter.php như sau -

<?php  
require __DIR__ . '/vendor/autoload.php';  

use Zend\EventManager\EventManagerInterface; 
use Zend\EventManager\EventManager; 
use Zend\EventManager\EventManagerAwareInterface; 

class Greeter implements EventManagerAwareInterface { 
   protected $events; public function setEventManager(EventManagerInterface $events) { 
      $events->setIdentifiers([__CLASS__, get_called_class(), ]); $this->events = $events; return $this; 
   }  
   public function getEventManager() { 
      if (null === $this->events) { $this->setEventManager(new EventManager()); 
      } 
      return $this->events; } public function greet($message) { 
      printf("\"%s\" from class\n", $message); $this->getEventManager()->trigger(__FUNCTION__, $this, [$message ]); 
   } 
} 

$greeter = new Greeter(); $greeter->greet("Hello");  
$greeter->getEventManager()->attach('greet', function($e) { 
   $event_name = $e->getName(); 
   $target_name = get_class($e->getTarget()); 
   $params_json = json_encode($e->getParams()); 
   printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n",
      $event_name, $target_name,  
      $params_json); }); $greeter->greet("Hello");

Bây giờ, chạy ứng dụng trong dấu nhắc lệnh php Greeter.php và kết quả sẽ như sau:

"Hello" from class 
"Hello" from class 
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]

Ứng dụng mẫu ở trên chỉ giải thích những điều cơ bản của người quản lý sự kiện. Trình quản lý sự kiện cung cấp nhiều tùy chọn nâng cao hơn nhưListener Priority, Custom Callback Prototype / Signature, Short Circuiting, v.v ... Trình quản lý sự kiện được sử dụng rộng rãi trong khuôn khổ Zend MVC.