liutao-me / laravel-transactional-model-events
在事务提交或回滚后添加Eloquent模型事件
3.0.0
2021-07-01 12:44 UTC
Requires
- php: ^7.2|^7.3|^8.0
- illuminate/database: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|~6.0,!=6.9.0|~7.0|~8.0
Requires (Dev)
- larapack/dd: ^1.0
- orchestra/testbench: ~4.0|~5.0|~6.0
- phpunit/phpunit: ^9.3
README
将事务性事件添加到您的Eloquent模型中。将自动检测事务中模型的变化,并在提交或回滚时触发事件。应模仿Ruby on Rails中的事务回调功能。
如果您想监听事务中模型触发的事件,并且确保事务已成功完成(或已回滚),则可以使用此功能。
安装
您可以通过composer安装此包
composer require mvanduijker/laravel-transactional-model-events
用法
只需将TransactionalAwareEvents特质添加到您的模型或基模型中。
<?php class MyModel extends Model { use TransactionalAwareEvents; }
以下事件将可用
afterCommit.createdafterCommit.savedafterCommit.updatedafterCommit.deletedafterCommit.restoredafterCommit.forceDeletedafterRollback.createdafterRollback.savedafterRollback.updatedafterRollback.deletedafterRollback.restoredafterRollback.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, ]; }
作为额外的甜点,您可以使用以下方法进行观察
afterCommitCreatedafterCommitSavedafterCommitUpdatedafterCommitDeletedafterCommitRestoredafterCommitForceDeletedafterRollbackCreatedafterRollbackSavedafterRollbackUpdatedafterRollbackDeletedafterRollbackRestoredafterRollbackForceDeleted
例如
<?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)。有关更多信息,请参阅许可证文件