5

我正在使用最新版本的 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。cookie 'laravel_payload' 和 'laravel_session' 以及 'remember_[HASH]' 确实存在,我可以使用 setcookie 使用常规 PHP 设置 cookie。

在我能找到的任何地方都不会抛出或记录任何错误。我在本地运行 Linux Mint 并在我的服务器上运行 Debian,两者都使用 nginx,我在这两个地方都有同样的问题。

4

3 回答 3

16

Cookie 不应该像这样使用,它们是为下一个请求设置的,而不是为当前请求设置的。并且您必须手动将它们附加到您的响应中,如文档中所述。

所以这段代码

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。

于 2013-04-04T09:26:25.870 回答
15

Laravel 4中,我们得到了预期的 cookie 行为queue

// 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 中使用puthttp://v3.golaravel.com/api/class-Laravel.Cookie.html#_put)。

例子:

Cookie::put('username', 'mojoman', 60 * 24 * 30); // 30 days
于 2013-11-14T23:40:43.503 回答
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 );
            }
    });
}
于 2013-09-19T20:34:40.293 回答