shlinkio / shlink-event-dispatcher

使用RoadRunner简化注册异步和常规PSR-14事件监听器。

v4.1.0 2024-04-14 06:34 UTC

This package is auto-updated.

Last update: 2024-09-04 11:37:34 UTC


README

这个库简化了在使用RoadRunner时注册异步和常规PSR-14事件监听器的过程。

异步的监听器使用RoadRunner作业执行。此库负责将事件注册为异步任务/作业的样板代码,您只需与普通的PSR-14监听器和事件交互即可。

它提供的大部分元素都需要一个PSR-11容器,并且由于包含的ConfigProvider,它很容易集成到mezzio应用中。

Build Status Code Coverage Latest Stable Version License Paypal donate

安装

使用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;
}