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

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector