在 Laravel 自定义中间件中设置 Cookie
Setting Cookie in Laravel Custom Middleware
我想在自定义 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。我该怎么做?
middleware 中的响应对象由 $next
闭包返回,因此您可以这样做:
if($request->hasCookie('uuid')) {
return $next($request);
}
$uuid = Uuid::generate();
return $next($request)
->withCookie(cookie()->forever('uuid', $uuid));
如果您正在使用 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。
我想在自定义 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。我该怎么做?
middleware 中的响应对象由 $next
闭包返回,因此您可以这样做:
if($request->hasCookie('uuid')) {
return $next($request);
}
$uuid = Uuid::generate();
return $next($request)
->withCookie(cookie()->forever('uuid', $uuid));
如果您正在使用 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。