samsonos/php_event

SamsonPHP事件模块

1.0.4 2015-01-10 12:09 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:43:15 UTC


README

##SamsonPHP事件模块 我们构建了一个独特且非常简单的方法来创建事件驱动的逻辑,使得我们的模块和类能够非常松散地耦合。所有核心模块代码都是使用这种方法构建的,这为扩展其功能并添加高级特性提供了无限的能力。这种方法是以编程模式观察者(Observer)为前提构建的,但采取了一些不同的方法。

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

Latest Stable Version Build Status Coverage Status Code Climate Total Downloads Scrutinizer Code Quality

基础知识

我们创建了一个简单的静态类,在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 事件订阅者,如果其中任何一个更改了它,它将无处不在地被更改。