我使用的是最新版本的Laravel 4,我无法设置Cookie:
Route::get('cookietest', function()
{
Cookie::forever('forever', 'Success');
$forever = Cookie::get('forever');
Cookie::make('temporary', 'Victory', 5);
$temporary = Cookie::get('temporary');
return View::make('cookietest', array('forever' => $forever, 'temporary' => $temporary, 'variableTest' => 'works'));
});
查看脚本:
@extends('layouts.master')
@section('content')
Forever cookie: {{ $forever }} <br />
Temporary cookie: {{ $temporary }} <br />
Variable test: {{ $variableTest }}
@stop
收率:
Forever cookie:
Temporary cookie:
Variable test: works
如果我刷新页面或在一个路径中创建cookie并尝试在另一个路径中访问它们并不重要。我可以确认没有使用上述操作设置cookie。 cookies'laravel_payload'和'laravel_session'以及'remember_ [HASH]'确实存在,我可以使用setcookie使用常规PHP设置cookie。
在我找不到的任何地方都不会抛出或记录任何错误。我在本地运行Linux Mint,在我的服务器上运行Debian,两者都使用nginx,我在两个地方都有同样的问题。
答案 0 :(得分:16)
Cookie不应该像这样使用,它们被设置为下一个请求,而不是当前请求。您必须手动将它们附加到您的响应中,如documentation中所述。
所以这段代码
Cookie::forever('cookie', 'value');
$cookie = Cookie::get('cookie');
将不会得到任何结果,因为在请求结束时未附加cookie。
您可以通过将其分成两个路径(例如
)来尝试Route::get('cookieset', function()
{
$foreverCookie = Cookie::forever('forever', 'Success');
$tempCookie = Cookie::make('temporary', 'Victory', 5);
return Response::make()->withCookie($foreverCookie)->withCookie($tempCookie);
});
Route::get('cookietest', function()
{
$forever = Cookie::get('forever');
$temporary = Cookie::get('temporary');
return View::make('cookietest', array('forever' => $forever, 'temporary' => $temporary, 'variableTest' => 'works'));
});
然后首先访问yoursite.local/cookieset
然后yoursite.local/cookietest
以查看它是否以这种方式工作,并且将设置Cookie。
答案 1 :(得分:15)
在 Laravel 4 中,我们通过queue
获得了预期的Cookie行为。
// Set a cookie before a response has been created
Cookie::queue('key', 'value', 'minutes');
示例:
Cookie::queue('username', 'mojoman', 60 * 24 * 30); // 30 days
警告:在 Laravel 3 中使用put
(http://v3.golaravel.com/api/class-Laravel.Cookie.html#_put)。
示例:
Cookie::put('username', 'mojoman', 60 * 24 * 30); // 30 days
答案 2 :(得分:0)
afterFilter可用于在控制器中设置Cookie。假设cookie存储在控制器的类变量$ cookie中。在控制器的构造函数中,以下代码将自动将cookie插入到返回给客户端的任何视图中:
public function __construct () {
$cookie = &$this->cookie;
$this->afterFilter(function ($route, $request, $response) use(&$cookie) {
if ($cookie) {
$response->withCookie( $cookie );
}
});
}