事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。
例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。
https://github.com/Tinywan/webman-event
composer require tinywan/webman-event
事件配置文件
config/event.php
return [
// 事件监听
'listener' => [],
// 事件订阅器
'subscriber' => [],
];
进程启动配置
打开 config/bootstrap.php
,加入如下配置:
return [
// 这里省略了其它配置 ...
webman\event\EventManager::class,
];
事件类
LogErrorWriteEvent.php
declare(strict_types=1);
namespace extend\event;
use Symfony\Contracts\EventDispatcher\Event;
class LogErrorWriteEvent extends Event
{
const NAME = 'log.error.write'; // 事件名,事件的唯一标识
/** @var array */
public array $log;
public function __construct(array $log)
{
$this->log = $log;
}
public function handle()
{
return $this->log;
}
}
return [
// 事件监听
'listener' => [
\extend\event\LogErrorWriteEvent::NAME => \extend\event\LogErrorWriteEvent::class,
],
];
订阅类 LoggerSubscriber.php
namespace extend\event\subscriber;
use extend\event\LogErrorWriteEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LoggerSubscriber implements EventSubscriberInterface
{
/**
* @desc: 方法描述
* @return array|string[]
*/
public static function getSubscribedEvents()
{
return [
LogErrorWriteEvent::NAME => 'onLogErrorWrite',
];
}
/**
* @desc: 触发事件
* @param LogErrorWriteEvent $event
*/
public function onLogErrorWrite(LogErrorWriteEvent $event)
{
// 一些具体的业务逻辑
var_dump($event->handle());
}
}
事件订阅
return [
// 事件订阅
'subscriber' => [
\extend\event\subscriber\LoggerSubscriber::class,
],
];
触发 LogErrorWriteEvent
事件。
$error = [
'errorMessage' => '错误消息',
'errorCode' => 500
];
EventManager::trigger(new LogErrorWriteEvent($error),LogErrorWriteEvent::NAME);
执行结果
This project is licensed under the Apache 2.0 license.
感谢分享。
项目地址好像错了
已改
大佬好,这用起来真方便,多多分享,打造webman生态
我觉得,应该把event事件写入框架文档
源码在这里:https://github.com/Tinywan/webman-admin
老大,大佬,事件非常好用易用,要是再有个可以开发插件用hook就齐全了。
我使用的laravel
配置
config/events.php
事件类:Test
监听类
订阅类
helpers.php 增加
调用触发事件
event(new Test('event data'));
这个也容易,还有定义助手函数
我不用 laravel 的,向symfony看齐
使用这个出现A facade root has not been set.
在 eloquent model 里面已经有集成 laravel 的 event dispatcher,可以通过 model::created(closure $func) 监听,是否可以将 event 的集成方式也加入 webman 官方文档呢?
webman 只做最基础的
https://github.com/yzh52521/webman-event
棒,可以提交到插件中心吗
已提交 在审核中
好的,感谢大佬贡献
@yzh52521 为啥事件没有基于 illuminate/events:^9.0 。看到版本锁定为 ^8.0,无法使用最新的。
https://www.workerman.net/plugin/28 @yzh52521 我包想降个版本安装你的包,还要降低 php 8.0 版本到 7.3 版本。┭┮﹏┭┮
php8.0是可以使用的 现在已经兼容php8.1 illuminate/events 9.X
好的。谢谢大佬