samsonos/ php_event
SamsonPHP事件模块
Requires (Dev)
- phpunit/phpunit: 4.*
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2024-09-24 01:43:15 UTC
README
##SamsonPHP事件模块 我们构建了一个独特且非常简单的方法来创建事件驱动的逻辑,使得我们的模块和类能够非常松散地耦合。所有核心模块代码都是使用这种方法构建的,这为扩展其功能并添加高级特性提供了无限的能力。这种方法是以编程模式观察者(Observer)为前提构建的,但采取了一些不同的方法。
事件为我们提供了移除类间连接的机会,因此非常适合编写单元测试。另一方面,在转向基于事件的系统之前,我们有许多不同的处理程序堆栈,每个堆栈都只完成特定目标,并且必须具有字段和函数来与之交互,使用事件方法我们不再需要所有这些堆栈、函数和其他东西。
基础知识
我们创建了一个简单的静态类,在SamsonPHP中提供所有这些出色的功能,称为\samson\core\Event
。这个类有两个主要的简单静态函数
fire($id, $params)
signal($id, $params)
subscribe($id, $params)
事件标识符
这是连接事件订阅者和执行者的主要参数,标识符必须符合以下标准规则
- 必须是小写 - 因为所有标识符都仅在小写中进行解析
- 必须由以下部分组成:
[模块名称].[子模块名称].[事件名称]
- 事件名称,如果较长,必须使用下划线('_')分隔。所有触发模块和类的事件必须在其文档的
事件
部分中指定
事件 - 订阅
此方法用于为特定事件标识符注册监听器,实际上没有验证或检查此标识符是否会在某处触发,我们实际上并不知道,但我们希望如此,并且我们的希望将会实现,因为我们可以阅读模块文档,并只为现有事件订阅。这样做的原因是因为我们无法保证哪些事件实际上会被触发,因为代码可以按不同的顺序加载(多亏了自动加载),并且subscribe()可以在事件声明之前被调用得要早得多,所以我们决定并把这个责任放在了开发者的肩上,只有他们必须考虑他们订阅了哪些事件。
方法声明
subscribe($key, $handler, $params = array())
$key
- 唯一的事件标识符,阅读模块文档以了解哪些事件和何时将被触发。$handler
- 回调,可以是简单的字符串callme
,如果这只是函数的话,或者array($obj, '[method_name]')
或array('[class_name]', '[method_name]')
用于静态方法。$params
- 需要在事件处理程序执行时所需的一组附加数据,此数组将被传递给回调参数。
每次调用事件订阅都会返回唯一的事件标识符,这个标识符可以用于取消订阅事件。
事件 - 取消订阅
如果您出于某种原因想要取消对某些事件的事件订阅,则需要使用事件标识符和处理器标识符:方法声明
unsubscribe($key, $identifier)
$key
- 唯一的事件标识符,阅读模块文档以了解哪些事件和何时将被触发。$identifier
- 唯一的事件处理器标识符,它从事件订阅函数调用返回。
事件 - 触发
此方法用于通知所有其他已订阅当前事件标识符的监听器(模块、类)事件正在此处发生。当此方法被触发时,意味着所有订阅者都必须在此确切的时间和地点处理当前事件。
方法声明
function fire($key, $params = array())
$key
- 唯一的事件标识符,触发此事件的一方必须在文档中指定它。$params
- 将传递给回调函数的附加数据集合,此集合与订阅参数集合不同,因为它来自事件触发端。
在代码中触发事件之前,请三思而后行,因为必须确保这是一个真正需要且有用的事件,以避免系统开销。
实际事件触发时,系统会将事件触发参数与订阅参数合并,事件触发参数将首先传递给回调函数。这样做的原因是可能有任何数量的订阅者,参数数量不同,但事件触发参数永远不会改变。
事件 - 信号
此方法用于执行最后一个订阅者回调将被调用,并且它的执行结果将被返回。当此事件必须仅处理一次时,将执行此操作。方法声明
function signal($key, $params = array())
所有其他逻辑与事件 - 触发相同
例如,对于路由系统的事件,您不能在一个应用程序中使用多个路由系统。
在已订阅的事件处理器中更改数据
当您想要将变量传递给事件处理器以更改它时,只需使用具有引用语法的数组。
Event::fire('core.routing', array(&$url, $count))
在上面的示例中,我们通过引用传递了 $url 变量给所有可能的 core.routing
事件订阅者,如果其中任何一个更改了它,它将无处不在地被更改。