Laravel не заканчивает метод контроллера по нескольким запросам - PullRequest
0 голосов
/ 12 октября 2018

Я попытался решить множественное нажатие на кнопку отправки с помощью ReCaptcha V3.Это работает, так как вставка базы данных запускается только один раз в контроллере, и в следующий раз она просто запускает проверку, возвращая ошибку.

Проблема заключается в том, что метод контроллера не выполняется полностью.

Например, если я нажимаю несколько раз на кнопку отправки на странице электронной коммерции, в CheckoutController метод checkout запускается не полностью.

class CheckOutController extends Controller {

    public function checkout(Request $request) {
        // Some checkout Logic (insert into database)
        $this->validate($request, [
                'recaptcha' => ['required', new \App\Rules\Recaptcha]
            ]);
        if (Cart::content()->count() > 0) {
            foreach (Cart::content() as $cartItem) {
              $insert = new \App\Transaction;
              $insert->product_id = $cartItem->id;
              $insert->receipt_id = $cartItem->receipt_id;
              $insert->quantity = $cartItem->qty;
              $insert->price= $cartItem->price;
              $insert->save();
            }
         Cart::destroy(); //last part of checkout logic
        return view('finishCheckout');
        }
        return abort(404);  
    }
}

Поскольку я работаю локально, скорость выше, поэтому запрос перебирает мой код, вставляя данные в мою базу данных.

Иногда запрос попадает в часть Cart:: destroy(); логики, иногда - нет. Но я подозреваю, что в производственной среде код может остановиться в другом месте до этой части.

И это никогда не достигнет return view('finishCheckout');.Он просто повторяет тот же метод и не проходит проверку, возвращая меня обратно на страницу оформления заказа с ошибкой проверки.

Могу ли я что-нибудь сделать, чтобы убедиться, что все методы запущены или остановленыот полного запуска?

Изменить: Обратите внимание, что это происходит только тогда, когда я нажимаю кнопки отправки несколько раз!Если бы я щелкнул по нему только один раз, метод работает правильно.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Лучшим решением было бы предотвратить двойной щелчок на стороне клиента.создайте функцию javascript, которая onSubmit отключает кнопку отправки.

Таким образом, пользователь получит ответ на первый сделанный им вызов, а не последний (в случае двойной отправки)

Кстати, вы можете симулировать медленный сервер.просто добавьте sleep(3) в начале метода контроллера.

0 голосов
/ 12 октября 2018

Моя теория состоит в том, что, поскольку вы нажимаете кнопку несколько раз, по одному из запросов она перебирает содержимое корзины и затем достигает метода Cart::destroy(), а затем по другим запросам, потому что это уже было,сбой условия и переход к функции abort(404).

Если вы делаете запрос с помощью Ajax, меня это не удивляет.При асинхронных HTTP-запросах, если вы нажмете кнопку еще раз, это создаст новый запрос и позволит продолжить предыдущий, а не отменять его.Это должен быть ваш интерфейс, чтобы при нажатии кнопки во время выполнения запроса она отключалась, поэтому дальнейшие запросы не могли быть выполнены.

0 голосов
/ 12 октября 2018

Перед удалением use \Cart

Можно использовать Cart::delete() or Cart::where(....)->delete()

...