mvanduijker/laravel-transactional-model-events

添加事务提交或回滚后触发的eloquent模型事件

2.8.0 2024-03-13 20:19 UTC

This package is auto-updated.

Last update: 2024-09-13 21:28:27 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

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

鸣谢

许可协议

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