介绍
面向对象设计通过让每个类有明确的分工责任,确保代码的灵活性和可扩展性。开发人员可以通过继承父类,修改其中方法。如果是想要和其他做同样事情的开发人员共享其中的改变,通过继承的方法将无法实现。
举个例子,你想为自己的项目添加一个插件系统,插件需要能够添加方法,或者是当做一个事情之前或者执行一个方法之后做些其他的事情。通过继承很难将实现。
Symfony2通过实现Mediator模式(中间人)可以实现该功能。
以HttpKernel组件为例,当响应对象创建之后,用系统的其他元素对其进行修改将非常必要(例如添加缓存声明),symfony通过扔出一个kernel事件来实现:
- 一个聆听者(对象)告诉发令中心对象(dispatcher)事件
- 在某个时刻,symfony2 kernel告诉调度对象分派事件,把Response对象作为一个可以访问的参数传递出去
- 调度对象通知所有的聆听者,允许他们对Resonse对象进行修改
安装
- 使用官方git仓库(/symfony/EventDispatcher)
- 使用composer
使用方法
事件
当一个事件被分派出去的时候,它需要一个独一无二的标识符,也是所有聆听者聆听的对象。一个事件实例也会被创建并且传递到所有的聆听者。事件对象常常包含被分派的事件对象。
命名规范
可以是符合下面规则的任何字符串
- 小写字母,数字,点,下划线
- 前缀名空间后面加点
- 以一个动词作为结尾,用来说明将要发生的事情(例如请求)
比如:
- form.pre_set_data
事件名称和事件对象
当调度对象通知聆听者的时候,它将事件对象作为参数传递过去。时间对象的基类非常简单,里面只有一个停止事件扩张的方法。
通常情况下,关于特定事件的数据需要同时和事件对象一起传过去,这样聆听者可以有需要的信息。当创建一个事件的聆听者时,传递到聆听者的事件对象可能是事件对象的一个子类,里面包含了更多的可以提取和响应该事件的信息。
发令者(The Dispatcher)
发令者是事件分发系统的核心成员。总而言之,只有一个发令者被创建,维护所有注册的聆听者,当一个事件被分派的时候,它会通知所有聆听那个事件的聆听者。
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
连接聆听者
为了使用已经存在的事件,需要连接聆听者,这样当发生特定事件的时候可以执行行动
$listener = new AcmeListener();
$dispatcher->addListener('', array($listener, 'onFooAction'));
addListener有三个参数:
- 聆听的事件的名称
- 当事件触发是一个可执行的php回调函数
- 被执行的顺序可选的一个数字,越高则越重要
未完待续