如何在交易完成后运行某些东西?
例如:
$message = array();
DB::transaction(function() use (...) {
$message = array('12345');
}
return response()->json($message, 200); // == []
我怎么能等到关闭完成?生病时尝试:
DB::transaction(function() use (...)
{
return response()->json($message, 200); // no response
}
有什么想法吗?
我现在已经找到了一个解决方案,当使用时:
$message = DB::transaction(function() use (...) {
return array('12345');
}
// then $message is correct
答案 0 :(得分:1)
交易不是异步处理的,因此您不必担心这一点。但是,在行之间进行读取,似乎您的挑战实际上是如何在未在本地定义时修改闭包内的数据。答案是use(&$data)
。
use
范围的closure
语句实际上将变量本地化为闭包,允许您从中读取并写入。但是,像往常一样,变量必须是passed by reference
才能在闭包完成后返回修改后的值,如下所示:
$message = array();
DB::transaction(function) use(&$message) {
$message = array('12345');
});
return response()->json($message);
此外,请勿在返回前忘记提交交易:
DB::commit();
事实上,对于您的场景,我建议将其全部包装在try/catch
语句中,当与事务相结合时,它允许您处理可能遇到的错误/成功的任何场景。交易过程:
try {
$message = array();
DB::transaction(function() use(&$message) {
$message = array(1,2,3,4,5);
});
DB::commit();
return response()->json($message, 200);
} catch (\Exception $e) {
DB::rollback();
return response()->json($e->getMessage, 422);
}
注意 422
是Laravel推荐的错误代码,当您遇到unprocessable entities
时会返回