randomstate / laravel-doctrine-entity-events
使用laravel-doctrine轻松挂钩并触发原生Laravel事件
v0.2.3
2023-05-17 12:44 UTC
Requires
- laravel-doctrine/orm: ~1.3
Requires (Dev)
- laravel/laravel: 6.0.*
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-17 15:44:19 UTC
README
此包提供了一个简单的方法来挂钩到Doctrine2实体事件并将它们重映射到原生Laravel事件。
入门
- 使用
composer require randomstate/laravel-doctrine-entity-events
安装 - 将
RandomState\LaravelDoctrineEntityEvents\LaravelDoctrineEntityEventsServiceProvider::class
添加到config/app.php
的providers
部分
使用方法
配置
辅助方法 (推荐)
<?php use RandomState\LaravelDoctrineEntityEvents\EventRedirector; public class AppServiceProvider extends ServiceProvider { public function register() { EventRedirector::register(function(EventRedirector $redirector) { $redirector->redirect(MyEntity::class) ->postPersist(MyEntityWasCreated::class) ->postUpdate(MyEntityWasUpdated::class) ->postFlush() // falls back to default as no destination is provided ->default(SomethingHappenedToMyEntityEvent::class); }); } }
拦截服务实例化
<?php use RandomState\LaravelDoctrineEntityEvents\EventRedirector; public class AppServiceProvider extends ServiceProvider { public function register() { $this->app->resolving(EventRedirector::class, (function(EventRedirector $redirector) { $redirector->redirect(MyEntity::class) ->postPersist(MyEntityWasCreated::class) ->postUpdate(MyEntityWasUpdated::class) ->postFlush() // falls back to default as no destination is provided ->default(SomethingHappenedToMyEntityEvent::class); })); } }
事件
您指定的每个Laravel事件作为目标时,在创建时会提供实体和Doctrine事件参数。实体作为第一个参数提供,因此当您只对实体本身感兴趣时,可以方便地忽略其他事件参数。
<?php class MyEntityWasCreated { public function __construct(MyEntity $entity, LifecycleEventArgs $eventArgs) { // do something } public function handle() { // do something } }
高级使用
如果您需要自定义事件实例化的方式,在定义重定向时提供一个闭包作为您的 '目标'。
<?php EventRedirector::register(function(EventRedirector $redirector) { $redirector->redirect(MyEntity::class) ->postPersist(MyEntityWasCreated::class) ->postUpdate(function(MyEntity $entity) { $mailer = app('mailer'); event(new MyEntityWasUpdated($entity, $mailer)); // customised instantiation }) ->postFlush() // falls back to default as no destination is provided ->default(SomethingHappenedToMyEntityEvent::class); });