Laravel App 执行两个请求,但第二个不需要

Bro*_*zka 2 php request laravel laravel-5

我发现,我的 Laravel (5.7) 应用程序在某些情况下有一个奇怪的行为,它执行两个表单提交请求。上周一切正常。

例如:有一个注册表。当用户想要注册并提交表单时,他无法通过验证,因为输入的电子邮件地址已经存在(在他提交表单之前并不正确)。在我的数据库中一瞥向我展示了用户已创建并登录。因此,表单似乎以某种方式执行了两个请求。

这种行为发生在整个应用程序的几种形式上,但不是全部。这会导致一些非常糟糕的操作(上面的操作,电子邮件发送两次,图像上传两次等)。

一个可能的问题原因可能是一个新的中间件,我在其中访问当前请求并对其执行一些操作:

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        $response = $next($request);

        if(!$request->hasCookie($cookie_name)){
            $response->cookie($cookie_name, $cookie_value, $cookie_lifetime);
            return $response;
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者还有其他可能导致此类问题的可能性吗?


更新

问题是我的 CookiebannerMiddleware。该问题已通过以下解决方案解决:

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {

        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        if(!$request->hasCookie($cookie_name)){
            return $next($request)->withCookie($cookie_name, $cookie_value, $cookie_lifetime);
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*noo 5

避免调用$next($request)两次:

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        $response = $next($request);

        if(!$request->hasCookie($cookie_name)){
            $response->cookie($cookie_name, $cookie_value, $cookie_lifetime);
        }

        return $response;
    }
}
Run Code Online (Sandbox Code Playgroud)