Как я могу запустить что-то после завершения транзакции?
например:
$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
Транзакции не обрабатываются асинхронно, поэтому вам не нужно об этом беспокоиться. Однако при чтении между строк может показаться, что на самом деле ваша задача — как изменить данные внутри замыкания, если они не определены локально. Ответ на 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
Других решений пока нет …