randomstate/laravel-doctrine-entity-events

使用laravel-doctrine轻松挂钩并触发原生Laravel事件

v0.2.3 2023-05-17 12:44 UTC

README

此包提供了一个简单的方法来挂钩到Doctrine2实体事件并将它们重映射到原生Laravel事件。

入门

  • 使用 composer require randomstate/laravel-doctrine-entity-events 安装
  • RandomState\LaravelDoctrineEntityEvents\LaravelDoctrineEntityEventsServiceProvider::class 添加到 config/app.phpproviders 部分

使用方法

配置

辅助方法 (推荐)

<?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); 
        });