jalle19 / laravel-deferred-event-dispatcher
Laravel 和 Lumen 框架的延迟事件分发器
Requires
- php: >=7.1
- illuminate/contracts: ^5.4|^6.0
- illuminate/events: ^5.4|^6.0
Requires (Dev)
- phpunit/phpunit: ^7.0
This package is auto-updated.
Last update: 2024-08-29 04:37:17 UTC
README
Laravel 和 Lumen 框架的延迟事件分发器。
动机
事件是任何框架的强大功能之一。它允许您解耦代码,使得触发事件的逻辑不必知道对事件的响应应该是什么。
尽管 Laravel/Lumen 中的默认实现在大多数情况下完全足够,但它相当天真,这可能导致性能不佳。考虑以下场景
- 您有自己的
EventServiceProvider
,在其中注册了许多事件订阅者。 - 您在启动文件中注册了这个服务提供者
在底层,每当注册 EventServiceProvider
时,都会构建 EventDispatcher
。事件分发器随后将遍历您定义的所有事件处理器,并为每个事件处理器构建它们,以便在发生事件的情况下知道要触发哪些监听器。
虽然这听起来并不糟糕,但这意味着即使是对于最简单的请求(例如,只打印 "OK" 的路由,例如健康检查路由),也会导致构建所有事件订阅者,这可能需要调用大量您不需要来满足请求的代码(例如,Doctrine 和其他 "重型" 服务")。
如果不是因为大多数请求可能不会触发任何事件,那么这本来并不是那么糟糕。但这会导致构建和注册所有事件处理器毫无意义。这个事件分发器实现旨在解决该问题。
延迟解析监听器和订阅者
一个简单但相当有效的方法是在实际派发事件之前延迟解析事件处理器。这确保我们不会在不会触发任何事件的请求中执行任何不必要的操作。但是,有一个问题...
许多服务在底层使用事件
- 某些服务提供者在启动前后派发事件,以允许其他服务提供者钩入这些事件并执行可选的启动逻辑
- 缓存存储库将在您尝试从缓存中检索内容时派发
Illuminate/Cache/Events/CacheHit
和Illuminate/Cache/Events/CacheMissed
事件。根据您的应用程序,这可能在几乎每个请求中都会发生。
即使我们延迟解析事件处理器直到派发事件,也有可能在每个请求中至少派发一个事件,这抵消了整个目的。
延迟特定事件
很可能您不关心缓存操作是命中还是未命中,或者服务提供者是否已启动。忽略这些事件将进一步延迟事件处理器的解析,可能持续整个请求,这意味着我们最终达成了不无谓地构建所有事件处理器的目标。
要求
- Laravel/Lumen >= 5.4
- PHP >= 7.1
使用方法
- 使用 Composer 安装库
composer require jalle19/laravel-deferred-event-dispatcher
- 用这个替换默认的事件分发器
// The event dispatcher must be a singleton $app->singleton(\Jalle19\Laravel\Events\DeferredEventDispatcher::class, function () use ($app) { return new \Jalle19\Laravel\Events\DeferredEventDispatcher($app, [ // Cache events Illuminate\Cache\Events\CacheHit::class, Illuminate\Cache\Events\CacheMissed::class, ]); }); // Swap the default implementation for this one. Some classes type-hint the interface, others simply use "events" $app->alias(\Jalle19\Laravel\Events\DeferredEventDispatcher::class, 'events'); $app->alias(\Jalle19\Laravel\Events\DeferredEventDispatcher::class, Illuminate\Contracts\Events\Dispatcher::class);
在这个例子中,我们决定在派发缓存事件时延迟解析事件处理器。
- 确保您的事件服务提供商在这些行之后已注册
就是这样,您的事件处理器现在只有在发生您未显式延迟的事件时才会解析!
许可证
MIT