我想在自定义Laravel中间件中设置cookie。我们的想法是在用户通过任何目标网页访问我的网站时设置Cookie值。
所以我做的是创建了一个名为UUIDMiddleware
的中间件。我在我的路线中使用这个中间件和Web中间件。以下是来自中间件的代码。
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。我该怎么做?
答案 0 :(得分:10)
您可以像middleware一样获取响应对象:
public function handle($request, Closure $next)
{
$response = $next($request);
// Do something after the request is handled by the application
return $response;
}
所以你可以做这样的事情
if($request->hasCookie('uuid')) {
return $next($request);
}
$uuid = Uuid::generate();
$response = $next($request);
return $response->withCookie(cookie()->forever('uuid', $uuid));
答案 1 :(得分:0)
如果您正在使用Laravel 5.8,并且像我一样,您想要一个解决方案,该解决方案允许您设置cookie的失效时间,而不是将其设置为永久,那么您也可以在middleware中执行以下操作:< / p>
public function handle($request, Closure $next)
{
$time = time() + 60 * 60 * 24; //One day
$res = $next($request);
return $res->cookie('cookie_name', $cookieValue, $time, "/");
}
这将在控制器完成请求并返回响应时设置cookie。