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

时间:2018-11-06 10:32:34

标签: php laravel laravel-5 request

我发现,在某些情况下,我的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);
    }
}

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


更新

问题是我的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);
    }
}

3 个答案:

答案 0 :(得分:3)

您打了两次

$response = $next($request);

您应该简单地做

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

答案 1 :(得分:2)

避免两次调用$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;
    }
}

答案 2 :(得分:0)

这有时是由于用户不小心提交了两次表单而引起的,在这种情况下,您需要在Submit事件之后禁用Submit按钮,以防止出现多个请求。

在以下情况下这可能会有所帮助: How to Prevent Users from Submitting a Form Twice