bit3/contao-event-dispatcher

该包已被废弃,不再维护。作者建议使用 contao-community-alliance/event-dispatcher 包。

Contao开源CMS的事件调度服务

dev-master / 1.0.x-dev 2013-10-30 15:00 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:25:46 UTC


README

为什么需要为Contao开源CMS提供事件调度器,钩子不够用吗?首先,你需要理解,钩子和事件之间没有真正的区别。它们都是来自系统内部的通告。

但事件比钩子更具弹性。它们可以在层次结构中传递、消费、停止或冒泡。

Contao存在事件调度器的真正重要原因包括

  1. 事件 是软件设计中的标准范式。
  2. 钩子 是一种改变软件行为的范式,它不是为通知而设计的。
  3. 钩子只是事件的一种特殊形式。
  4. 此扩展基于广泛使用的 symfony 事件调度器
  5. 事件调度器可以处理各种形式的回调,如闭包或静态方法。

监听事件

事件调度器提供了两种监听事件的方式。

首先是事件监听器,它被设计为监听单个事件。

第二种是事件订阅者,它被设计为监听多个事件。

按配置使用事件监听器

使用 $GLOBALS['TL_EVENTS'] 来注册你的事件处理器。

使用闭包

$GLOBALS['TL_EVENTS']['event-name'][] = function($event) {
	// event code
};

使用静态调用

$GLOBALS['TL_EVENTS']['event-name'][] = array('MyClass', 'myCallable');

使用对象调用

$GLOBALS['TL_EVENTS']['event-name'][] = array(new MyClass(), 'myCallable');

按优先级处理

要定义优先级,可以使用一个数组,将监听器作为第一个元素,将优先级作为第二个元素。

$GLOBALS['TL_EVENTS']['event-name'][] = array($listener, $priority);

按代码使用事件监听器

$container['event-dispatcher']->addListener('event-name', $listener);

按配置使用事件订阅者

使用 $GLOBALS['TL_EVENT_SUBSCRIBERS'] 来注册你的订阅者。

使用工厂

$GLOBALS['TL_EVENT_SUBSCRIBERS'][] = function($eventDispatcher) {
	return new MyEventSubscriber();
};

使用对象类名

$GLOBALS['TL_EVENT_SUBSCRIBERS'][] = 'MyEventSubscriber';

使用对象实例

$GLOBALS['TL_EVENT_SUBSCRIBERS'][] = new MyEventSubscriber();

按代码使用事件订阅者

$container['event-dispatcher']->addSubscriber(new MyEventSubscriber());