samsonphp/event

SamsonPHP事件模块

1.0.6 2015-01-13 16:43 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:34:38 UTC


README

#SamsonPHP事件模块 最新稳定版本 构建状态 代码覆盖率 Scrutinizer代码质量 待处理故事 总下载量

我们采用独特且非常简单的方法来创建事件驱动逻辑,使我们的模块和类具有非常松散的耦合,所有核心模块代码都是使用这种方法构建的,这为扩展其功能并添加更高级功能提供了无限的能力。这种方法是在考虑到编程模式观察者的情况下构建的,但有一点不同。

事件为我们提供了移除类之间连接的机会,因此非常适合编写单元测试。另一方面,在转向基于事件的系统之前,我们有很多不同的处理程序堆栈,每个堆栈只完成特定的目标,并且必须具有处理它的字段和函数,而基于事件的方法不再需要所有这些堆栈、函数和其他东西。

基本概念

我们创建了一个简单的静态类来在SamsonPHP中提供所有这些功能,称为\samson\core\Event。此类有两个主要的简单静态函数

  • fire($id, $params)
  • signal($id, $params)
  • subscribe($id, $params)

事件标识符

这是连接事件订阅者和执行者的主要参数,标识符必须符合以下标准规则

  • 必须是小写 - 因为所有标识符都只按小写解析
  • 必须由以下部分组成:[module_name].[sub_module_name].[event_name]
  • 事件名称,如果较长,必须用下划线('_')分隔。所有触发模块和类的事件都必须在文档的“事件”部分中指定

事件 - 订阅

此方法用于注册特定事件标识符的监听器,实际上并没有对标识符是否会被触发进行验证或检查,我们并不知道,但我们希望,并且我们的希望将会实现,因为我们能够阅读模块文档并仅订阅现有的事件。这样做是因为我们无法保证哪些事件实际上会被触发,因为代码可以以不同的顺序加载(归功于自动加载),而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事件,如果其中一个更改它,它将在每个地方更改。