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