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?
2 回答
首先,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 理论中,根本没有事件。它们确实充当助手,但同样 - 在框架中,您可以抽象它们并称它们为“事件”。
这篇文章帮助我理解了 ZF2 中的 EventManager:
事件管理器是框架的组件,它允许您连接到应用程序中的命名事件。
框架中有一组现有的命名事件,例如控制器中的调度事件。您还可以根据应用程序的目的创建自己的。这是第一步。然后,您附加(或侦听)这些事件。当它们触发或被触发时,您的代码会询问事件的上下文并在需要时做出响应。
参考: http: //www.maltblue.com/tutorial/zend-framework-2-event-manager-a-gentle-introduction