ZF2 - Event manager |
Trước tiên, để Model có thể xử lý như một Event, chúng ta cần import thêm một số Interface, sau đó cho class Model của mình thực thi Interface như đoạn code bên dưới.
namespace Application\Model; use Zend\EventManager\EventManagerAwareInterface, Zend\EventManager\EventManagerInterface, Zend\EventManager\EventManager; abstract class AbstractModel implements EventManagerAwareInterface { private $eventManager; public function getEventManager() { if (!$this->eventManager) { $this->setEventManager(new EventManager(__CLASS__)); } return $this->eventManager; } public function setEventManager(EventManagerInterface $eventManager) { $eventManager->addIdentifiers(array( get_called_class() )); $this->eventManager = $eventManager; return $this; } }
Trong đây chúng ta thực thi 1 interface đó là EventManagerAwareInterface, khi thực thi interface này thì đồng thời cũng phải khai báo 2 function như trong ví dụ bên trên. Hàm getEventManager() dùng để lấy đối tượng EventManager của ZF2, còn hàm set thì dùng để set đối tượng. Trong đây mình có thêm một phần đó là addIdentifiers và bổ sung class được gọi (get_called_class) vì class mình đang demo là abstract class - không thể tạo đối tượng từ class này.
Như vậy việc cấu hình đã xong, các class con của class Model này có thể sử dụng Event của ZF2 như sau:
namespace Application\Model; class Category extends AbstractModel { public function addNewCategory($params) { /* Do something here */ // Trigger event $this->getEventManager()->trigger( __FUNCTION__, NULL, array( /* Param for event */ ) ); /* Do anything else here */ } }
Ở đây, mình trigger một Event tại function addNewCategory và mình dùng tên function để làm tên Event luôn (chú ý phần __FUNCTION__ ở trên). Khi kích hoạt trigger, bạn có thể đưa tham số đi theo Event để Listener có thể xử lý sau đó.
Tiếp theo, chúng ta sẽ cài đặt việc xử lý của Listener cho Event này như phần coding bên dưới.
namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; class ManagementController extends AbstractActionController { public function addCategoryAction() { /* Do something heere */ // Listener event and use closure to process event $this->getEventManager() ->getSharedManager() ->attach ( 'Application\Model\Category', 'addNewCategory', function ($e) { /* Process event here */ }, -100 ); /* Do anything else here */ } }
Ở đây chúng ta chú ý một tí về hàm attach bên trên. Tham số đầu tiên là class đã trigger sự kiện (Trong trường hợp này là Application\Model\Category). Tham số thứ 2 là tên sự kiện - cái này do chúng ta dùng hồi nãy tại function addNewCategory nên nó cũng có giá trị là addNewCategory. Tham số thứ 3 là callback function và ở đây thì mình dùng closure để thực hiện. Tham số thứ 4 là priority của Listener - giá trị càng cao thì càng được hành động trước. Ở đây mình muốn sau khi thêm mới thành công thì làm thêm 1 số tác vụ khác nên để là -100.
Bài viết không có chủ đích viết về cách thức hoạt động của Event Manager trong ZF2 như thế nào, chỉ là một phần ghi chú cho việc dùng một Model có Event trong đó.
Xem thêm các bài viết khác về ZF2 - tại blog tmquang6805.blogspot.com
No comments:
Post a Comment