Zend\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 實例。