tjovaisas / delayed-event-bundle
处理常规事件方式中post flush doctrine事件的包
0.4.0
2022-02-05 15:00 UTC
Requires
- php: ^8.0
- doctrine/doctrine-bundle: ^2.3
- doctrine/orm: ^2.7
- symfony/config: ^5.3 || ^6.0
- symfony/dependency-injection: ^5.3 || ^6.0
- symfony/event-dispatcher: ^5.3 || ^6.0
- symfony/framework-bundle: ^5.3 || ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- phpunit/phpunit: ^9.0
- symfony/yaml: ^5.3 || ^6.0
- vimeo/psalm: ^4.7
This package is auto-updated.
Last update: 2024-09-05 20:39:59 UTC
README
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