2017-01-20 7 views
0

Как я могу запустить что-то после завершения транзакции?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 
} 

Любые идеи?

Ill уже нашел решение сам теперь, когда заболел использование:

$message = DB::transaction(function() use (...) { 
    return array('12345'); 
} 

// then $message is correct 
+0

Вашего первым примером должен работать так же, как вы хотите. Он не будет пытаться запускать все, что находится в закрытии, и остальную часть вашего кода одновременно, он будет ждать завершения закрытия. Есть ли что-то, что заставляет вас думать, что это не так? – user3158900

+0

Нет, это не работает, но я уже нашел решение самостоятельно. – derdida

ответ

2

Сделки не обрабатываются асинхронно, так что вам не придется беспокоиться об этом. Тем не менее, чтение между строками показало бы, что ваша задача состоит в том, как изменить данные внутри замыкания, если они не определены локально. Ответ: 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

+0

Спасибо за ваш ответ и объяснение! – derdida

+0

Я считаю, что этого много не нужно. Laravel будет совершать для вас и даже откатываться за вас в случае «Исключения» или «Throwable». – user3158900

+0

@ user3158900 Я понимаю, что лучшие практики могут отличаться между разработчиками, но я не совсем уверен, какую проблему вы найдете с моим ответом? – Ohgodwhy