bit3 / contao-event-dispatcher
dev-master / 1.0.x-dev
2013-10-30 15:00 UTC
Requires
- php: >=5.3
- contao-community-alliance/composer-installer: *
- contao-community-alliance/dependency-container: ~1
- contao/core: >=2.11,<3.3
- symfony/event-dispatcher: 2.3.*
This package is not auto-updated.
Last update: 2022-02-01 12:25:46 UTC
README
为什么需要为Contao开源CMS提供事件调度器,钩子不够用吗?首先,你需要理解,钩子和事件之间没有真正的区别。它们都是来自系统内部的通告。
但事件比钩子更具弹性。它们可以在层次结构中传递、消费、停止或冒泡。
Contao存在事件调度器的真正重要原因包括
- 事件 是软件设计中的标准范式。
- 钩子 是一种改变软件行为的范式,它不是为通知而设计的。
- 钩子只是事件的一种特殊形式。
- 此扩展基于广泛使用的 symfony 事件调度器。
- 事件调度器可以处理各种形式的回调,如闭包或静态方法。
监听事件
事件调度器提供了两种监听事件的方式。
首先是事件监听器,它被设计为监听单个事件。
第二种是事件订阅者,它被设计为监听多个事件。
按配置使用事件监听器
使用 $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());