在 Laravel 中事务失败后,存在某种方法可以执行某些操作吗?我知道可以使用 try/catch,但事务内部还有其他委托指令,它们已经使用了 try/catch 语句。
DB::transaction(function () {
$this->otherService->Create($data);
});
class OtherService
{
public function Create(){
try{
//Some database operations
}catch(Exception $e){
}
}
}
我需要帮助,谢谢!
如果您想处理失败的事务而不直接在事务周围使用
try/catch block
,您可以利用数据库事件和观察者。 Laravel 提供了 TransactionCommitted
和 TransactionRolledBack
事件,您可以监听并执行操作。这可以避免直接在事务代码周围放置 try/catch 块。
创建一个监听
TransactionRolledBack
事件的观察者:
php artisan make:observer TransactionFailedObserver --queued
在
TransactionFailedObserver
类中,处理回滚事件:
use Illuminate\Database\Events\TransactionRolledBack;
class TransactionFailedObserver
{
public function __construct()
{
//
}
public function failed(TransactionRolledBack $event)
{
// Logic to execute when a transaction fails
// You can add your desired actions here, such as logging or additional operations
// Example: Log the exception
logger()->error('Transaction failed: ' . $event->exception->getMessage());
// Example: Rollback another related action
// Your code here...
}
}
在
EventServiceProvider
中注册观察者:
protected $listen = [
'Illuminate\Database\Events\TransactionRolledBack' => [
'App\Observers\TransactionFailedObserver@failed',
],
];
无需
try/catch block
即可触发交易:
use Illuminate\Support\Facades\DB;
DB::transaction(function () use ($data) {
$this->otherService->create($data);
});