madeiramadeirabr / event-observer
此包的最新版本(1.1.3)没有可用的许可信息。
观察者设计模式:https://pt.wikipedia.org/wiki/Observer
此包的规范存储库似乎已丢失,因此已将其冻结。
1.1.3
2019-08-16 20:35 UTC
Requires
- php: ^7.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- phpro/grumphp: ^0.14.3
- phpstan/phpstan: ^0.11.2
- phpunit/phpunit: ^7.5
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2022-04-21 23:52:18 UTC
README
事件观察者
视频
描述
用于实现观察者模式的库:https://pt.wikipedia.org/wiki/Observer
此库实现了PHP的标准接口,以实现观察者模式
- https://php.ac.cn/manual/pt_BR/class.splsubject.php
- https://php.ac.cn/manual/pt_BR/class.splobserver.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