在Laravel 4中从事务中返回数据


Returning data from within a Transaction in Laravel 4

我有下面的代码片段,我似乎不能让它工作。

$paymentGatewayTransaction = $this->processTransaction($data);
DB::connection('new_db')->transaction(function () use ($paymentGatewayTransaction) {
    //Performing all DB transactions here to insert Order Information.
    if ($paymentGatewayTransaction['Status'] == "APPROVED")
        return Response::json(array('Status' => 'Success'), '200'); else
        return Response::json(array('Status' => 'Error'), '200');
});
function processTransaction($data) {
    //Process Gateway Transaction
    if ($gatewayWasSuccessfull)
        return array('Status' => 'APPROVED'); else
        return array('Status' => 'DECLINED');
}

57上返回Response::json()似乎没有任何影响。该响应从未到达浏览器。

如果我将If条件从4行到8行移到闭包函数之外,它可以正常工作。

我最终不得不做以下的工作作为解决方案。

$paymentGatewayTransaction = $this->processTransaction($data);
$orderObj = "";
DB::connection('new_db')->transaction(function () use ($paymentGatewayTransaction, &$orderObj) {
    //Performing all DB transactions here to insert Order Information.
    // **$orderObj is set here**
});
if ($paymentGatewayTransaction['Status'] == "APPROVED")
    return Response::json(array('Status' => 'Success', 'Order' => $orderObj->id), '200'); else
    return Response::json(array('Status' => 'Error'), '200');
function processTransaction($data) {
    //Process Gateway Transaction
    if ($gatewayWasSuccessfull)
        return array('Status' => 'APPROVED'); else
        return array('Status' => 'DECLINED');
}

在闭包外部创建对象$orderObj,并将其作为引用事务的变量,以便在闭包函数外部使用它。这能更简单吗?或者这是使用它的方法吗?

可以将事务闭包的返回值赋给如下变量:

$paymentGatewayTransaction = $this->processTransaction($data);
$var = DB::connection('new_db')->transaction(function () use ($paymentGatewayTransaction) {
    //Performing all DB transactions here to insert Order Information.
    if ($paymentGatewayTransaction['Status'] == "APPROVED")
        return Response::json(array('Status' => 'Success'), '200'); else
        return Response::json(array('Status' => 'Error'), '200');
});
return $var;

那么你可以使用$var返回