Zend Framework 2 事件驱动编程的理解

利用程序解决一个问题时,我们通常会确定各个步骤以及步骤的顺序,这就是面向过程编程;而面向对象编程在解决问题的逻辑上仍然是过程化的。为了使步骤之间能够连贯执行,我们需要函数之间的来回调用,使得各函数之间形成依赖。事件驱动编程能够解耦这种依赖关系。

如果完成一件事分为A、B、C三个步骤(函数),A做完了调用B,B做完了调用C,事情结束了。事件驱动编程不需要A、B、C之间的调用,加入一个事件管理器(EventManager,简称EM),A通知EM我做完了(AFinished事件被EM抛出),此时A就不管了,你们谁接着执行跟我没关了。如果B要在A完成后执行,B就可以预先告诉EM,如果A做完了我做(即将B绑定到AFinished事件)。这样A与B之间的关系是由EM控制的,而不需要A、B之间互相调用。

举例解释

我们来举一个“项目开发”的例子,一个项目的开发通常是流水线的,假设是这样:
产品经理先确定需求->交互设计师设计交互过程->开发工程师开发->测试工程师测试->发布
我们把他看成一个面向过程的编程问题,就是产品经理 调用 交互设计师 调用 开发工程师 调用 测试工程师,如图:

zend framework 2 事件驱动

用程序语言表示:

function main(){
    demondAnalyze();
}
function demondAnalyze(){
     //进行需求分析工作;
     design();
}
 
function design(){
    //进行交互设计;
    develop();
}
 
function develop(){
    //进行开发
    test();
}
 
function test(){
    //测试
    //结束
}

这种方式相当于一个临时组建的团队,没有负责人,工作合作靠成员之间内部沟通,需要每个步骤的人跟下一个步骤的人沟通,去唤起下一个人的工作。使得下一个人的工作的启动依赖于前一个人。这样每一个步骤都需要对其后续步骤非常清楚。

下面我们请一个项目总监来管理团队,把沟通工作全部交给他,那么方式应该是这样的,如图:

zend framework 2 事件驱动

用程序表示如下:

function main(){
    projectManager();
}
 
function projectManager(){
    $demandReport = demandAnalyze();
    $designDocument = design($demandReport);
    $product = develop($designDocument);
    $testResult = test($product);
    //over
}
 
function demandAnalyze(){}
function design(){}
function develop(){}
function test(){}

这种方式解除了各步骤之间的依赖关系,步骤的先后关系、数据传递关系都由项目总监负责,此时各步骤负责人处于被动位置,不再考虑自己的前后步骤沟通,专注于自己的工作,等待项目总监的调用,这就需要项目总监对项目特别熟悉,如果新增一个步骤,都需要项目总监处理。

那么事件驱动模型是什么方式呢?事件驱动模式也需要一个管理者,但不是项目总监,而是事件管理者(EM),他不需要懂项目,只需要管理好事件即可。这种模式认为被调用者比管理者更清楚应该在什么时候执行。每一个人必须向EM注册当什么事件发生时我执行(事件绑定),每个人可以通过EM抛出一个事件(事件触发)。当一个事件触发时,EM通知绑定这个事件的人执行,如图。

zend framework 2 事件驱动

如此,各步骤的执行不等待别人的直接调用,而是等待一个事件的发生(事件被绑定到一个回调)。程序表示如下:

function main(){
    demand();
}
function demand(){
    //进行需求分析工作
    $em->trigger("demandFinishedEvent");
}
function design(){
    $em->bind("demandFinishedEvent",function(){
         //进行设计工作
         $em->trigger("designFinishedEvent");
    });    
}
//以此类推
ZF2中的事件驱动模式

在ZF2中,事件驱动模式的关键在于:

  • 事件,就是一个行为状态(是一个包含数据的Object)
  • 事件由事件管理器抛出
  • 事件侦听器是一个回调,注册到事件上,对事件的反应
  • 事件管理器存储着事件侦听器与事件之间的关联关系,一个事件可以被多个侦听器侦听。通过调用事件管理器抛出事件

事件驱动模式是观察者模式的一种延伸。大量被使用在前端界面开发中。

事件是一个类的对象,可以携带步骤之间交流的数据,事件绑定时可以设置优先级,优先级高的先执行。事件可以被中断。如图:

zend framework 2 事件驱动

事件驱动模式在zf2中起着至关重要的作用,module的加载、bootstrap、试图渲染等等都是靠EventManager关联的,如图:
zend framework 2 事件驱动

事件模式的简单实现代码:

//绑定事件到侦听器
$eventManager = $serviceManger->get("EventManager");
$eventManager->attach('DO_EVENT', function($e){
    $eventName = $e->getName(); //"DO_EVENT"
    $eventData = $e->getParams();
    //做事
});
 
//事件抛出
//some object class
function do($some, $thing){
   $params = compact($some, $thing);
   $this->getEventManager->trigger("DO_EVENT", $this, $params);
}
 
$someObject->do("some","thing");
事件驱动模式可以轻松地实现类似wordpress的插件(Hooker)功能,在WP中,每一个可以挂载插件的地方都放置一个钩子,而事件驱动模式把每一个事件可以看成是一个钩子,任何需要在此事件发生时执行的都可以注册到此事件,极大提升了项目的扩展性。
——————————————–
本站除标注[FW]和资讯文章外都为原创文章,转载请注:
转载来源: Coming X
原文链接: Zend Framework 2 事件驱动编程的理解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值