September 7, 2013

Zend Framework 2 - Model is also event

ZF2 - Event manager
Trong ZF2, mọi thứ đều là event, điều này có nghĩa rằng không chỉ Controller-Action là event mà cả Model do bạn tạo ra cũng là event. Controller\Action trong ZF2 thì đã được cấu hình sẵn, chúng ta chỉ việc gọi lệnh và chạy là xong. Tuy nhiên, vì mọi thứ đều là event nên Model do chúng ta dựng lên cũng là một event. Có một điều là chúng ta phải tinh chỉnh thêm 1 tí để dễ dàng hơn cho việc coding.

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