Laravel等到交易结束?

时间:2017-01-20 21:11:47

标签: php laravel

如何在交易完成后运行某些东西?

例如:

$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

1 个答案:

答案 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时会返回