2013-06-18 3 views
2

У меня есть следующий фрагмент кода, который я не могу заставить его работать.Возвращаемые данные изнутри транзакции в 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'); 
} 

Возвращение Ответ :: JSON() на линиях 5 и 7, кажется, не имеют никакого эффекта. Ответ никогда не доходит до браузера.

Если я перемещаю условие 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 за пределами Закрытие и сделал его в качестве переменной в качестве ссылки на сделку, чтобы использовать его вне функции закрытия. Может ли это быть проще или это способ использовать его?

ответ

10

Вы можете присвоить значения возвращаемые закрытия сделки в переменной, как это:

$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; 

Затем вы можете использовать $ вар вернуться.

+0

Это очень интересно, так как это означает, что любые операторы return изнутри 'transaction()' остаются в 'transaction()' очень похожим на инструкцию функции. – enchance

Смежные вопросы