【问题标题】:Setting Cookie in Laravel Custom Middleware在 Laravel 自定义中间件中设置 Cookie
【发布时间】:2016-01-11 18:54:16
【问题描述】:

我想在自定义 Laravel 中间件中设置一个 cookie。这个想法是在用户通过任何登陆页面访问我的网站时设置 cookie 值。

所以我创建了一个名为UUIDMiddleware 的中间件。我在我的路由中使用这个中间件和网络中间件。下面是它的中间件代码。

if($request->hasCookie('uuid'))
{
    return $next($request);    
}
else
{
    $uuid = Uuid::generate();
    $response = new Response();
    return $response->withCookie(cookie()->forever('uuid', $uuid));
}

如您所见,我正在检查 cookie 是否存在。如果没有,我将把控制权交给下一个请求。

问题是使用return $response 设置cookie 时,我无法将控制权传递给下一个请求。我该如何解决这个问题?

在这种情况下,如果未设置 cookie,则会设置 cookie 并显示空白屏幕。如果我刷新,我会看到设置了 cookie 的网站。

必须有一种方法以正确的方式使用中间件设置 cookie。我该怎么做?

【问题讨论】:

    标签: laravel laravel-5.1 laravel-5.2


    【解决方案1】:

    middleware 中的响应对象由 $next 闭包返回,因此您可以执行以下操作:

    if($request->hasCookie('uuid')) {
        return $next($request);    
    }
    
    $uuid = Uuid::generate();
    return $next($request)
        ->withCookie(cookie()->forever('uuid', $uuid));
    

    【讨论】:

    • 这似乎不再起作用了。无论您是否返回它,调用$next($request) 都会中断句柄方法并继续请求。
    • @Chris 这不是真的(至少对于 Laravel 5.4)。你确定你注册了中间件吗?
    • @Boyd 中间件已注册。最后我要做的是返回 $next($request)->withCookie() 并提供我的 cookie 对象。除非明确定义,否则实际上似乎没有携带 cookie
    • 我不确定这个答案的意义是什么(或者为什么它获得了 16 个赞成票),因为它只是重复了问题中的代码。我已经对其进行了编辑以提供一个可行的解决方案。
    • 虽然代码不一样...而您只是重构了答案
    【解决方案2】:

    如果您使用 Laravel 5.8 并且像我一样想要一个允许您设置 cookie 的过期时间而不是将其设置为永久的解决方案,您也可以在 middleware 中执行类似的操作:

    public function handle($request, Closure $next)
    {
        $time = time() + 60 * 60 * 24; //One day
        $res = $next($request);
        return $res->cookie('cookie_name', $cookieValue, $time, "/");
    } 
    

    这将在控制器完成请求并返回响应时设置 cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-27
      • 2011-04-22
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多