【发布时间】:2019-03-03 13:28:33
【问题描述】:
如果发生异常,PHP/Laravel 中有没有办法撤消多个步骤?我知道DB::transaction(function()...,但是在使用外部库的情况下它不起作用......
就我而言,我使用的是 Stripe:
1.) 创建Source
2.) 创建Customer
3.) 将Source 附加到Customer
4.) 为Customer 创建一个Subscription
但如果有来自 Stripe 的 external Exception,例如在最后一步,我希望其他三个步骤不执行,而是返回错误消息。
注意:我正在使用 Laravel 的异常处理程序来 catch 异常。
如果有办法解决这个问题,我会很高兴:-)
这与可能的重复不同,因为如果发生异常,我想撤消几个步骤
【问题讨论】:
-
@Martin 这不会撤消在 try 子句中已经成功的操作。
-
感谢您的 cmets。 @Martin 我认为撤消前面的步骤无济于事......如果发生异常,它会转到
catch块,但前面的步骤会执行 -
你总是可以有一个回滚历史,例如“创建源代码和函数
$rollback = function () use ($source) { delete source }”然后在每个步骤中编写这个函数以及在发生错误时要做什么,如果你发现错误调用回滚函数。或者您可以询问 Stripe API 开发人员,他们是否可以对他们的 API 进行这种跨国/原子访问,或者要求一个新的 API 调用以原子方式执行这 4 个步骤。此 AFAIK 没有通用解决方案 -
@SebastianS 我想你提到 Laravel 和
DB::Transaction()让每个人都感到困惑。这仅对回滚对您自己的数据库的更改有用,与远程 API 无关。
标签: php laravel exception undo