liutao-me/laravel-transactional-model-events

在事务提交或回滚后添加Eloquent模型事件

3.0.0 2021-07-01 12:44 UTC

This package is auto-updated.

Last update: 2024-09-29 06:20:21 UTC


README

Latest Version on Packagist Build Status Total Downloads

将事务性事件添加到您的Eloquent模型中。将自动检测事务中模型的变化,并在提交或回滚时触发事件。应模仿Ruby on Rails中的事务回调功能。

如果您想监听事务中模型触发的事件,并且确保事务已成功完成(或已回滚),则可以使用此功能。

安装

您可以通过composer安装此包

composer require mvanduijker/laravel-transactional-model-events

用法

只需将TransactionalAwareEvents特质添加到您的模型或基模型中。

<?php

class MyModel extends Model
{
    use TransactionalAwareEvents;
}

以下事件将可用

  • afterCommit.created
  • afterCommit.saved
  • afterCommit.updated
  • afterCommit.deleted
  • afterCommit.restored
  • afterCommit.forceDeleted
  • afterRollback.created
  • afterRollback.saved
  • afterRollback.updated
  • afterRollback.deleted
  • afterRollback.restored
  • afterRollback.forceDeleted

您可以在EventServiceProvider中以正常事件的方式添加监听器

<?php

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'eloquent.afterCommit.created: App\Models\Shipment' => [
        'App\Listeners\SendShipmentNotification',
    ],
];

或者您可以将它们放在模型的boot方法中

<?php

class PictureFile extends Model
{
    use TransactionalAwareEvents;
    
    public static function boot()
    {
        parent::boot();
        
        static::registerModelEvent('afterCommit.deleted', function ($model) {
            if (Storage::exists($model->file)) {
                Storage::delete($model->file);            
            }
        });
    }
}

您还应能够将它们映射到事件类

<?php

class PictureFile extends Model
{
    use TransactionalAwareEvents;
    
    protected $dispatchesEvents = [
        'afterCommit.created' => PictureFileCreated::class,
        'afterCommit.deleted' => PictureFileDeleted::class,
    ];
}

作为额外的甜点,您可以使用以下方法进行观察

  • afterCommitCreated
  • afterCommitSaved
  • afterCommitUpdated
  • afterCommitDeleted
  • afterCommitRestored
  • afterCommitForceDeleted
  • afterRollbackCreated
  • afterRollbackSaved
  • afterRollbackUpdated
  • afterRollbackDeleted
  • afterRollbackRestored
  • afterRollbackForceDeleted

例如

<?php

class PictureFileObserver
{
    public function afterCommitDeleted(PictureFile $model)
    {
        if (Storage::exists($model->file)) {
            Storage::delete($model->file);            
        }
    }
}

并在您的ServiceProvider中注册观察者

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        PictureFile::observe(PictureFileObserver::class);
    }
}

支持多个数据库连接,当事务在模型配置的连接上提交时触发事件。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

贡献

有关详细信息,请参阅CONTRIBUTING

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件