shlinkio / shlink-event-dispatcher
使用RoadRunner简化注册异步和常规PSR-14事件监听器。
Requires
- php: ^8.2
- league/event: ^3.0
- psr/event-dispatcher: ^1.0
- psr/log: ^3.0
- shlinkio/shlink-config: ^3.0 || ^2.5
- shlinkio/shlink-json: ^1.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^11.0
- roave/security-advisories: dev-master
- shlinkio/php-coding-standard: ~2.3.0
- spiral/roadrunner-jobs: ^4.3
- symfony/var-dumper: ^7.0
Suggests
- spiral/roadrunner-jobs: To be able to run async event dispatchers as roadrunner job tasks
README
这个库简化了在使用RoadRunner时注册异步和常规PSR-14事件监听器的过程。
异步的监听器使用RoadRunner作业执行。此库负责将事件注册为异步任务/作业的样板代码,您只需与普通的PSR-14监听器和事件交互即可。
它提供的大部分元素都需要一个PSR-11容器,并且由于包含的ConfigProvider
,它很容易集成到mezzio应用中。
安装
使用composer安装此库
composer require shlinkio/shlink-event-dispatcher
此库也是mezzio模块,它提供了自己的
ConfigProvider
。将其添加到您的配置中,即可自动设置一切。
用法
此模块允许在PSR-14事件分发器上注册常规和异步事件监听器。
常规监听器在同一进程中执行,会阻塞HTTP请求的分派,而异步监听器则委派给RoadRunner作业,使请求立即解决。
如果未找到RoadRunner,则默认情况下忽略异步监听器,但您可以选择将它们注册为常规监听器。
注意为了能够与RoadRunner作业集成,您需要安装
spiral/roadrunner-jobs
。
要注册监听器,您必须使用如下配置
<?php declare(strict_types=1); return [ 'events' => [ 'regular' => [ 'foo_event' => [ App\EventListener\FooRegularListener::class, App\EventListener\AnotherFooListener::class, ], 'bar_event' => [ App\EventListener\FooRegularListener::class, ], ], 'async' => [ 'foo_event' => [ App\EventListener\FooAsyncListener::class, ], ], ], ];
“events”配置条目有这些块。
regular
: 要为每个事件同步分派的具有所有监听器的列表。async
: 要作为RoadRunner作业执行的具有所有监听器的列表,每个事件一个。
在这两种情况下,监听器都通过其服务名称识别,使得服务仅在相应的事件被分发时才进行懒加载解析。
动态跳过注册监听器
有时您想为事件提供一个基本的监听器列表,但根据仅在运行时才知道的逻辑,您可能希望跳过它们实际的注册。
例如,如果您有一个将事件发送到RabbitMQ的监听器,但该功能是可选的,并且用户可能已禁用它。在这种情况下,您可以在运行时检查该功能是否已禁用,并跳过监听器注册。
此模块允许注册一个实现了Shlinkio\Shlink\EventDispatcher\Listener\EnabledListenerCheckerInterface
的服务,如果它解析了相同类型的实例,它将被用于决定是否注册监听器。
在此处注册的服务必须实现此方法
public function shouldRegisterListener(string $event, string $listener, ContainerInterface $container): bool { // Do some logic to determine if $service should be registered for $event // You have access to the service container, in case external resources need to be queried // Then return `true` or `false` }
如果没有找到服务,或解析了错误类型的实例,则使用默认实现,该实现注册所有监听器。
public function shouldRegisterListener(string $event, string $listener, ContainerInterface $container): bool { return true; }