garrettw/noair

此包已被弃用且不再维护。未建议替代包。

遵循Mediator行为模式的PHP事件库,类似观察者实现

v0.2 2017-07-27 22:28 UTC

This package is auto-updated.

Last update: 2023-06-18 00:06:44 UTC


README

Packagist Downloads Latest Stable Version License

Build Status Code Climate SensioLabsInsight Scrutinizer Code Quality

Noair

Noair(发音为“no-air”)是一个PHP库,它提供了一个中心事件中心,其他东西可以钩入以处理发布到该中心的事件。它以观察者风格实现了Mediator行为模式。

“为什么叫这个名字?”

稍后我们将解释。

“为什么我应该使用Noair而不是其他所有的事件库?”

因为Noair

  • 使用标准的观察者模式术语(发布/订阅)
  • 可以保留已发布但尚未有订阅者的事件,直到有处理程序订阅它
  • 除了常规发布事件外,还支持定时器事件
  • 允许处理程序订阅任何和所有事件(如果他们想的话)
  • 将事件信息封装在传递给处理程序的对象中
  • 事件对象可以保留发布者设置的供处理程序使用的数据集
  • 事件对象允许处理程序访问发布它们的对象
  • 事件对象允许处理程序访问之前的处理程序输出(用于级联)
  • 事件对象可以通过调用setCancelled()来防止进一步的级联
  • 处理程序可以是简单的匿名函数或包含在观察者对象中;任何可调用的事物
  • 观察者对象可以显式定义处理程序或使用on*()方法命名,其中*是大写的事件名称

“我真的很想知道名字的意义。”

好吧,好吧。我的项目是从一个叫“Podiya”的项目分叉出来的,“Podiya”是乌克兰语中的“事件”。我发现这个词在原始脚本中的样子,我觉得它像字母n-o-A-i-R。 自己看看吧。

核心原则

  • 观察者是有由触发事件调用的方法的对象。
  • 这些方法被称为处理程序,或者一旦注册,就称为订阅者。
  • 建议(但不是必需的)使用观察者对象来包含处理程序。

基本用法

想法是,你有多个事件处理程序监视单个事件中心,等待它们可以处理的事件。

  • 首先,你需要创建Noair的抽象观察者类的子类,这些子类包含处理程序
class MyObserver extends \Noair\Observer
{
    public function onThing(\Noair\Event $e)
    {
        return 'do it ' . $e->data;
    }
}
  • 现在,在您正在执行的主要代码中,您需要为您的事件创建一个中心:一个作为处理程序和触发事件代码之间的中介的Mediator对象。
$hub = new \Noair\Mediator(new \Noair\Manager);
  • 然后,您可以创建您的观察者类的对象并将它们订阅到中心。
$obs = (new MyObserver($hub))->subscribe();
  • 然后,您可以在代码中使用该中介对象发布观察者类可能处理的事件。
$hub->publish(new \Noair\Event('thing', 'now'));

// Now if you're an object-oriented fiend like me, you'll probably be calling that
// from within a method, like so:
// $this->mediator->publish(new \Noair\Event('thing', 'now', $this));

// Anyway, either of those will return: 'do it now'

高级用法

你可以做的唯一“高级”操作是设置具有自定义方法名称、自定义优先级或强制性的处理器(这意味着即使链中的其他处理器试图取消其余部分,该处理器也将运行)。你可以通过如下方式定义(实际上,是重写)subscribe()方法来实现

class OtherObserver extends \Noair\Observer
{
    public function subscribe() {
        $this->handlers = [
            'doWeirdThings' => [ // an event name that this class handles
                [$this, 'doWeirdThingsAlways'], // the callable that the event fires
                \Noair\Mediator::PRIORITY_HIGHEST, // how important this handler is
                true, // this is the forceability setting
            ],
        ];

        return parent::subscribe();
    }

    // This is just a normal handler
    public function onThing(\Noair\Event $e)
    {
        return 'do it ' . $e->data;
    }

    // Wait, this function doesn't start with "on"! How can it work?
    // See subscribe() above.
    public function doWeirdThingsAlways(\Noair\Event $e)
    {
        return 'do ' . $e->data . ' ' . rand() . ' times';
    }
}

$hub = new \Noair\Mediator();
$obs = (new OtherObserver($hub))->subscribe();

$hub->publish(new \Noair\Event('doWeirdThings', 'stuff'));

这可能返回: 执行5623次操作