首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Zend Framework 2 EventManager 事件管理器入門教程

     編輯:PHP 綜合知識

前言

Zend\EventManager\EventManager 實作主題/觀察者模式、面向切面設計、事件驅動架構。核心功能:附加/移除監聽器、觸發事件、中斷傳播、共用事件集合、通配符監聽。

快速開始:將 EventManager 注入類別

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

class Foo implements EventManagerAwareInterface {
    protected $events;

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

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

觸發事件

class Foo {
    // ... 上述 EventManagerAware 實作
    public function bar($baz, $bat = null) {
        $params = compact('baz', 'bat');
        $this->getEventManager()->trigger(__FUNCTION__, $this, $params);
    }
}

附加監聽器

use Zend\Log\Factory as LogFactory;

$log = LogFactory($someConfig);
$foo = new Foo();

$foo->getEventManager()->attach('bar', function ($e) use ($log) {
    $event   = $e->getName();
    $target  = get_class($e->getTarget());
    $params  = json_encode($e->getParams());
    $log->info(sprintf('%s called on %s, using params %s', $event, $target, $params));
});

$foo->bar('baz', 'bat');
// 日誌輸出:bar called on Foo, using params {"baz":"baz","bat":"bat"}

共用事件集合

透過 SharedEventManager 在不持有物件實例時附加監聽:

$events = new Zend\EventManager\SharedEventManager();
$events->attach('Foo', 'bar', function ($e) use ($log) { /* ... */ });

$foo = new Foo();
$foo->getEventManager()->setSharedEventCollection($events);
$foo->bar('baz', 'bat'); // 仍觸發上方共用監聽器

通配符與批次附加

模式代碼範例效果
多事件同回調$em->attach(array('e1','e2'), $cb);e1 或 e2 觸發時執行 $cb
所有事件$em->attach('*', $cb);任何事件觸發皆執行
共用集合多事件$sem->attach('Foo', array('e1','e2'), $cb);針對 Foo 類的 e1/e2
共用集合所有事件$sem->attach('Foo', '*', $cb);Foo 類任何事件

常用方法速查

  • trigger($event, $target, $argv, $callback):觸發,回傳 ResponseCollection。
  • triggerUntil($event, $target, $argv, $callback):回調回傳 true 即中斷。
  • attach($event, $callback, $priority):優先級高者先執行(預設 1,負數延後)。
  • detach($callbackHandler):移除特定監聽器。
  • getEvents()、getListeners($event)、clearListeners($event)。

配置選項

  • identifiers:共用集合識別字串陣列。
  • event_class:自訂 Event 類別。
  • shared_collections:注入 SharedEventCollection 實例。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved