Как помешать быстрому последовательному запросу в Laravel загрузить кешированные записи БД? - PullRequest
0 голосов
/ 23 мая 2018

У меня проблема, когда быстрый щелчок пользователя приводит к сбою промежуточного программного обеспечения.Мне трудно поймать ошибку в журнале, поэтому см. Общее описание ниже.

Сценарий

  • Пользователь создан.
  • Пользователь переходит на /profile
  • Промежуточное программное обеспечение hasAcceptedGDPR перенаправляет на маршрут / acceptGDPRBeforeContinuing
  • В представлении acceptGDPRBeforeContinuing пользователь нажимает ссылку на route / acceptGDPR, которая устанавливает флаг db, указывающий, что пользователь действительно принял условия gdpr.
  • Пользователь наконец перенаправлен в / profile

Это работает нормально, если вы нажимаете медленно.Нажатие принимает быстрее, чем ~ 5 секунд после загрузки страницы, снова запускает промежуточное ПО!Это указывает на то, что отсутствует какая-то асинхронная вещь или отсутствует какой-то кеш?По какой-то причине второй щелчок всегда работает.

Для моего друга, у которого на блестящем быстром Mac все работает нормально, но для моего медленного компьютера это проблема .. есть идеи, что здесь тестировать?

Контроллер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\UploadRequest;
use App\Pack;
use App\User;
use Auth;

class ProfileController extends Controller
{
    public function __construct()
    {
        $this->middleware([
            'auth'
        ]);        

        $this->middleware([
            'hasAcceptedGDPR'
        ])->except([
            'acceptGDPRBeforeContinuing', 'acceptGDPR'
        ]);

    }

    public function index() {
        return view('profile');
    }

    public function acceptGDPRBeforeContinuing() {
        return view('acceptGDPRBeforeContinuing');
    }

    public function acceptGDPR() {
        $user = Auth::user();
        $user->has_accepted_gdpr = true;
        $user->save();
        return redirect('/profile');    
    }

}

Промежуточное ПО:

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class HasAcceptedGDPR
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {        
        if(!Auth::user()->has_accepted_gdpr) {            
            return redirect('/acceptGDPRBeforeContinuing');
        }

        return $next($request);
    }
}

Маршруты:

Route::get('/profile', 'ProfileController@index');
Route::get('/acceptGDPRBeforeContinuing', 'ProfileController@acceptGDPRBeforeContinuing');
Route::get('/acceptGDPR', 'ProfileController@acceptGDPR');

Вид:

<h3>Please accept our privacy police before continuing</h3>
<a href="{{url('/acceptGDPR')}}">I accept it.</a>
...