tjovaisas/delayed-event-bundle

处理常规事件方式中post flush doctrine事件的包

0.4.0 2022-02-05 15:00 UTC

This package is auto-updated.

Last update: 2024-09-05 20:39:59 UTC


README

Latest Version on Packagist Software License PHPUnit Total Downloads

Symfony扩展包,用于以常规事件方式处理post flush doctrine事件

为什么?

Symfony已经提供了将事件分发到预定义订阅者的优秀方式。此包扩展了该功能,使监听器仅在flush调用后才能接收到已分发的事件。这样做有以下几个原因:

  • 应用程序需要在数据写入数据库后才能进行外部调用;
  • 应用程序需要在数据写入数据库后才能将数据发布到队列;
  • 应用程序的逻辑需要在高级别(例如控制器或命令)进行flush,而大部分逻辑位于服务中。这有助于避免从控制器或命令中发出多个事件;
  • 应用程序需要在数据写入数据库后才能执行其他额外步骤;

安装

composer require tjovaisas/delayed-event-bundle

注册包

将包注册到config/bundles.php

return [
    //...
    \Tjovaisas\Bundle\DelayedEventBundle\TjovaisasDelayedEventBundle::class => ['all' => true],
];

使用

可以通过服务配置定义或使用属性来配置包

  • 默认的kernel.event_listener标签可以更改为tjovaisas.event_listener.post_flush,以便在flush发生后在给定的监听器上分发消息
<service class="Namespace\SomeListener"
         id="namespace.some_listener">
    <tag name="tjovaisas.event_listener.post_flush" event="some_event" method="onEvent" priority="1" />
</service>
  • 使用属性。属性可以在整个类上定义
#[AsDelayedEventListener(event: 'some_event', method: 'onEvent', priority: 1)]
class SomeListener
{
    //...
}

或类方法上定义(仅适用于Symfony ^6.0)

#[AsDelayedEventListener(event: 'some_event')]
public function onEvent(): void
{
    //...
}

注意事项

如果使用事务,则没有简单的方法可以知道实体是否在更改后已在数据库中显示。

由于使用了事务的Doctrine默认行为,首先使用的是flush,然后是commit。这意味着监听器可能会收到带有已生成数据库字段(例如id)的数据的事件,但仍然可能不在数据库中100%。只有在调用commit后,事务才会被密封,如果此操作失败,更改将不会出现在数据库中,监听器也不会知道。

语义版本控制

此包遵循语义版本控制

此包的公共API(换句话说,如果您想轻松更新到新版本,则应仅使用这些功能)

  • 未标记为public="false"的服务;
  • 标记为@api的类、接口和类方法;
  • 控制台命令;
  • 支持的DIC标签。

例如,如果只有类方法标记为@api,则不应扩展该类,因为构造函数可能会在任何版本中更改。

有关API中可以更改和不能更改的基本信息的详细信息,请参阅Symfony BC规则。请注意,在此包中,默认情况下一切都是@internal

运行测试

composer update
composer test

贡献

请随意创建问题和提交拉取请求。

您可以使用此命令检查代码风格问题

composer analyze