mvanduijker / laravel-transactional-model-events
添加事务提交或回滚后触发的eloquent模型事件
2.8.0
2024-03-13 20:19 UTC
Requires
- php: ^7.3|^8.0
- illuminate/database: ~6.0,!=6.9.0|~7.0|~8.0|~9.0|~10.0|~11.0
Requires (Dev)
- larapack/dd: ^1.0
- orchestra/testbench: ~4.0|~5.0|~6.0|~7.0|~8.0|~9.0
- phpunit/phpunit: ^9.3|^10.0
README
将事务事件添加到您的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)。有关更多信息,请参阅许可文件。