Symfony2事件分发组件

介绍

面向对象设计通过让每个类有明确的分工责任,确保代码的灵活性和可扩展性。开发人员可以通过继承父类,修改其中方法。如果是想要和其他做同样事情的开发人员共享其中的改变,通过继承的方法将无法实现。

举个例子,你想为自己的项目添加一个插件系统,插件需要能够添加方法,或者是当做一个事情之前或者执行一个方法之后做些其他的事情。通过继承很难将实现。

Symfony2通过实现Mediator模式(中间人)可以实现该功能。

以HttpKernel组件为例,当响应对象创建之后,用系统的其他元素对其进行修改将非常必要(例如添加缓存声明),symfony通过扔出一个kernel事件来实现:
  • 一个聆听者(对象)告诉发令中心对象(dispatcher)kernel.response事件
  • 在某个时刻,symfony2 kernel告诉调度对象分派kernel.response事件,把Response对象作为一个可以访问的参数传递出去
  • 调度对象通知所有的kernel.response聆听者,允许他们对Resonse对象进行修改

安装

  • 使用官方git仓库(https://github.com/symfony/EventDispatcher)
  • 使用composer

使用方法

事件

当一个事件被分派出去的时候,它需要一个独一无二的标识符,也是所有聆听者聆听的对象。一个事件实例也会被创建并且传递到所有的聆听者。事件对象常常包含被分派的事件对象。

命名规范

可以是符合下面规则的任何字符串
  • 小写字母,数字,点,下划线
  • 前缀名空间后面加点
  • 以一个动词作为结尾,用来说明将要发生的事情(例如请求)
比如:
  • kernel.response
  • form.pre_set_data
事件名称和事件对象
当调度对象通知聆听者的时候,它将事件对象作为参数传递过去。时间对象的基类非常简单,里面只有一个停止事件扩张的方法。

通常情况下,关于特定事件的数据需要同时和事件对象一起传过去,这样聆听者可以有需要的信息。当创建一个事件的聆听者时,传递到聆听者的事件对象可能是事件对象的一个子类,里面包含了更多的可以提取和响应该事件的信息。

发令者(The Dispatcher)

发令者是事件分发系统的核心成员。总而言之,只有一个发令者被创建,维护所有注册的聆听者,当一个事件被分派的时候,它会通知所有聆听那个事件的聆听者。
use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();

连接聆听者

为了使用已经存在的事件,需要连接聆听者,这样当发生特定事件的时候可以执行行动
$listener = new AcmeListener();
$dispatcher->addListener('foo.action', array($listener, 'onFooAction'));

addListener有三个参数:
  • 聆听的事件的名称
  • 当事件触发是一个可执行的php回调函数
  • 被执行的顺序可选的一个数字,越高则越重要
未完待续
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值