Поскольку вы используете индикатор прогресса и продвигаете его, вы будете делать то же самое в ajax, но логика прогресса будет отличаться от курса.
Общей частью в обоих случаях является обработка каждой платежной карты.Поэтому я скажу создать отдельный класс или службу, которая принимает экземпляр платежной карты, например, PaymentProcess
, обрабатывает его и возвращает в случае успеха или неудачи.
Затем в команде вы можете выполнить (psuedocode):
public function handle () {$ pendingPayments = Payment :: where ('status', 'pending');
$bar = $this->output->createProgressBar($pendingPayments->count());
$pendingPayments->chunk(10, function($payments) use($bar){
$payments->each(function($payment) use ($bar){
$process = (new PaymentProcess($payment))->process();
$bar->advance();
});
});
$bar->finish();
}
Теперь, если вы запустите это из внешнего интерфейса,ответ ajax должен дать вам идентификатор текущего процесса, хранящегося где-то.Затем вы будете продолжать посылать другие ajx-запросы с интервалом, скажем, 1 секунду, и получать текущий прогресс, пока он не достигнет 100%.(Если вы используете XMLHttpRequest2, тогда логика будет отличаться)
Для этого вы можете создать еще одну таблицу для хранения результатов и затем обновлять ее.
Теперь аналогичным образом вы можете использовать PaymentProcess
внутри контроллера.:
открытая функция processPendingPayments (Request $ request) {// Авторизовать запрос $ this-> authorize ('processPendingPayments', Payment :: class);
$pendingPayments = Payment::where('status', 'pending');
// Create a progress entry
$progress = PaymentProgress::create([
'reference' => str_random('6')
'total' => $pendingPayments->count(),
'completed' => 0
]);
$pendingPayments->chunk(10, function($payments) use($bar){
$payments->each(function($payment) use ($bar){
$process = (new PaymentProcess($payment))->process();
// Update a progress entry
$progress->update([
'completed' => $progress->completed + 1;
]);
});
});
return response()->json([
'progress_reference' => $progress->reference
], 200);
}
Теперь еще одна конечная точка для получения прогресса
открытая функция getProgress (Request $ request) {// Авторизовать запрос $ this-> authorize ('getProgress', Payment :: class);
$request->validate([
'reference' => 'required|exists:payment_process,reference'
]);
$progress = PaymentProcess::where('reference', $request->reference)->first();
$percentage = $progress->completed / $progress->total * 100;
return response()->json(compact('percentage'), 200);
}