2

I know php and nodejs too,in javascript we have asynchronize programming ,so I understand meaning of event in it.but I saw Event in Yii and Zend 2 and use them too,but I can't understand the meaning of it,how it works in php and what exactly does in it?

4

2 回答 2

14

首先,PHP中没有事件

事件是带有名称的回调函数的抽象。$eventName => $listener通常,我们将它们定义$listener$eventName

事件和常规回调函数有什么区别?

再次 - 要记住的核心点是事件是回调函数。而已。

它们之间的唯一区别是我们如何调用它们。

事件在引导步骤中使用所需的参数定义,但在没有参数的情况下按需调用。虽然使用参数调用回调函数并且仅

考虑这个例子,

<?php

$eventManager = new EventManager();
$eventManager->attach('my_event', function(){

   print_r(func_get_args());

}, array('foo', 'bar'));

因为我们刚刚定义了一个事件,我们会像这样调用,

$eventManager->trigger('my_event');

这将输出:Array([0] => [foo], [1] => [bar]

这与JavaScript有关!

由于我们大多数人都熟悉 JavaScript 偶数驱动架构,因此无需提及其常见用法的示例:

var a = document.getElementsByTagName('a')[0];
a.onclick = function(event) { // <-- We define an event with the event argument
   event.preventDefault();
   alert('A element was clicked');
}

a.click(); // <-- but we invoke it without arguments

// or If you want a Jquery
$("a").click(function(event){
   event.preventDefault();
   alert('A element was clicked');
});

$("a").click();

由于在 PHP 中我们没有这种事件驱动的特性,我们可以将其替换为我们自己的管理事件并充分利用它的类。

为什么要使用它们?

尽管事件使很多人感到困惑,但它们非常有用。

想象一下,您有一个内容管理系统 (CMS),您的用户可以在其中决定如何处理404错误。说,他们可以处理

1) 显示空白页
2) 重定向到/
3) 显示自定义消息

如果没有事件,您将不得不这样做,例如

if ($router->isMatched($request)){

    //do dispatch etc

} else {

   // Here you start handling 404 errors

   switch($config->read('404_way_handle')){

       case 'show_blank':
          die();
       break;

       case 'show_msg':
          echo 'Some custom message';
       break;

       case 'redirect':
          // do redirect
       break;
   }
}

通过事件,您可以简化可读性并使代码更易于维护:

if ($router->isMatched($request)){
   // do dispatch
} else {

   $eventManager->trigger('404_handler');
}

404_handler它本身看起来像

  $eventManager->attach('404_handler', function(){

       switch($config->read('404_way_handle')){

           case 'show_blank':
              die();
           break;

           case 'show_msg':
              echo 'Some custom message';
           break;

           case 'redirect':
              // do redirect
           break;
       }

  }, $config);


所以让我们分解一下

1)事件提高了可读性,这对未来很有好处

2)事件确实遵守单一责任原则,因为您可以简单地注入$eventManager需要它的类,而回调函数可能会破坏它或也可能引入全局状态(这对单元测试不利)。

3) 有不同类型的逻辑 - 模板逻辑、业务逻辑、错误处理程序逻辑、数据访问逻辑等。事件确实通过将业务(或其他类型)逻辑与其配置逻辑解耦来简化您的应用程序逻辑,因此您最终具有清晰的应用逻辑。

如果你想知道它们在 Zend Framework 2 中是如何工作的,你可以观看这个讲座(即使你不熟悉 Zend Framework 2 也可以观看)

MVC 相关架构中的事件

由于您一直在谈论框架,因此无需多提,MVC-related架构中也可能存在事件。由于事件是回调函数,因此您可以boostrap在类似 MVC 的架构中抽象出常见事件,就像这样。

$mvcEvent->on(MVC_EVENT::ROUTE_MATCH, function(){

  $mvcEvent->on(MVC_EVENT::DISTPATCH, function($content){

    echo $mvcEvent->trigger(MVC_EVENT::RENDER, $content);

  });

});

注意:在纯 MVC 理论中,根本没有事件。它们确实充当助手,但同样 - 在框架中,您可以抽象它们并称它们为“事件”。

于 2013-06-29T07:10:39.467 回答
1

这篇文章帮助我理解了 ZF2 中的 EventManager:

事件管理器是框架的组件,它允许您连接到应用程序中的命名事件。

框架中有一组现有的命名事件,例如控制器中的调度事件。您还可以根据应用程序的目的创建自己的。这是第一步。然后,您附加(或侦听)这些事件。当它们触发或被触发时,您的代码会询问事件的上下文并在需要时做出响应。

在此处输入图像描述

参考: http: //www.maltblue.com/tutorial/zend-framework-2-event-manager-a-gentle-introduction

于 2013-06-29T06:41:10.567 回答