【问题标题】:Can't set cookies in Laravel 4无法在 Laravel 4 中设置 cookie
【发布时间】:2013-04-03 02:23:36
【问题描述】:

我使用的是最新版本的 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,我在这两个地方都有同样的问题。

【问题讨论】:

    标签: cookies laravel laravel-4


    【解决方案1】:

    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就会被设置。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • +1 表示排队。 L4 中队列方法的一个重要说明:有两个方法queuedqueue。前者是一个 getter 并返回一个已经排队的 cookie,后者将一个 cookie 排队。如果您不小心调用了queued('name', 'value'),它将静默失败,因为它可以接受 2 个参数:一个键和一个可选的默认值。
      【解决方案3】:

      afterFilter 可用于在控制器中设置 Cookie。假设 cookie 存储在控制器的类变量 $cookie 中。在控制器的构造函数中,以下代码将自动将 cookie 插入到返回给客户端的任何视图中:

      public function __construct () {
          $cookie = &$this->cookie;
          $this->afterFilter(function ($route, $request, $response) use(&$cookie)  {
                  if ($cookie) {
                      $response->withCookie( $cookie );
                  }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 2021-08-04
        相关资源
        最近更新 更多