madeiramadeirabr/event-observer

此包的最新版本(1.1.3)没有可用的许可信息。

观察者设计模式:https://pt.wikipedia.org/wiki/Observer

此包的规范存储库似乎已丢失,因此已将其冻结。

1.1.3 2019-08-16 20:35 UTC

This package is auto-updated.

Last update: 2022-04-21 23:52:18 UTC


README

事件观察者

Build Status Coverage Status

视频

描述

用于实现观察者模式的库:https://pt.wikipedia.org/wiki/Observer

此库实现了PHP的标准接口,以实现观察者模式

优点

  • 易于维护
  • 应用SOLID原则
    • 接口分离
    • 单一责任
  • 轻松更改观察者的执行优先级
  • 轻松启用或禁用观察者(包括在观察者内部)
  • 代码简洁、简单、易于阅读。

常见用例

需要在进行数据库数据保存后执行多种业务逻辑的。通常使用持久化数据的Model,并实现所有业务逻辑,但Model可能会变得非常大,如God Class,并具有多种责任,从而极大地增加了维护难度。

一个经典的例子是在保存订单后发送电子邮件,您可以通过创建方法(afterSave、afterUpdate)并简单地实现事件触发,电子邮件发送、通知等责任将由观察者负责。

安装

执行

composer require madeiramadeirabr/event-observer

使用示例

// Composer autoload
require_once('vendor/autoload.php');

use MadeiraMadeiraBr\Event\EventObserverFactory;
use MadeiraMadeiraBr\Integration\Event\Tests\Stub\Observer;
use MadeiraMadeiraBr\Integration\Event\Tests\Stub\Observer2;

// Factory Singleton Instance
$eventFactory = EventObserverFactory::getInstance();

// Adiciona os observers com uma key para referenciar o evento.
$eventFactory->addObserversToEvent('event_test', [Observer2::class, Observer::class]);

// Dispara o evento onde serão instanciados todos os objetos setados anteriormente.
$publisher = $eventFactory->dispatchEvent('event_test');

观察者

您可以通过仅实现 \MadeiraMadeiraBr\Event\ObserverInterface 接口来创建观察者类,并将其注入到上述方法中

示例

<?php 

namespace YourNamespace;

use  MadeiraMadeiraBr\Event\ObserverInterface

class IntegrateOrderToOtherServices implements ObserverInterface
{
    /**
    * {@inheritdoc}
    */
    public function update(SplSubject $publisher)
    {
        // Você pode pegar os dados passados no dispatchEvent dessa forma:
        $order = $publisher->getEvent();
    }

    /**
    * {@inheritdoc}
    */
    public function getPriority()
    {
        return 0;
    }
}

执行始终遵循每个观察者返回的优先级,无论它是设置在其他观察者之前还是之后。

注意事项

由于可以在观察者内部接收对象,因此执行特定对象的某个方法时需要小心,该对象可能是一个事件触发器。例如:如果在一个Order模型的方法afterSave中创建一个事件触发器,并且在观察者中接收Order模型并再次保存,它将再次执行观察者并陷入无限循环。如果需要这种做法,请在Model中再次保存数据之前始终进行检查。

测试

克隆存储库,通过Composer安装依赖,然后执行以下命令

composer test