【发布时间】:2013-11-30 03:58:21
【问题描述】:
我尝试在 Laravel 4 中的特定路线中设置 Cookie。
很遗憾,设置 Cookie 仅在全局 App::after() 过滤器中有效。
我尝试的第一件事是从我的Controller 回复Cookie。
这不起作用:
return Response::make($view)->withCookie(Cookie::make('foo','bar'));
但是,这样做:
return Response::make()->withCookie(Cookie::make('foo','bar'));
但不能解决我的问题。
接下来我尝试使用after 过滤器,如下所示。
Route::filter('cookie', function($route, $request, $response)
{
$response->withCookie(Cookie::make('foo', 'bar'));
});
这也不起作用。
接下来,我使用 Cookie::queue() 尝试了它,我在另一个 answer 中找到了它 - 没有运气。
正确设置 Cookie 的唯一位置是 App::after()。
App::after(function($request, $response)
{
$response->withCookie(Cookie::make('foo', 'bar'));
});
除了我很确定其他方法之一应该可以工作之外,这个解决方案并没有给我我正在寻找的控制。
我正在运行 Laravel v4.0.9。
【问题讨论】:
-
您是如何尝试访问 cookie 的?请记住,在 下一个 页面加载之前,cookie 不可用。这就是 cookie 的工作原理,与框架实现无关。
-
我使用(浏览器)Web Inspector 来检查是否设置了 cookie。
-
我认为问题是当您设置 cookie 'before' 时,尚未创建响应对象。然后在您的控制器中,您创建一个“新” Response::return() 等 - 因此任何先前的值都将被覆盖。这就是为什么它正在处理您的“之后”过滤器,因为您正在将它添加到创建的对象中。
-
但是为什么它在自定义后过滤器中不起作用?在那里,我将 cookie 附加到响应中。此外,它可以在文档中找到(four.laravel.com/docs/responses):
return Response::make($content)->withCookie($cookie);,这里解释了队列方法:laravel.com/docs/requests#cookies
标签: php cookies laravel laravel-4