2013-04-03 60 views
5

设置cookies我使用的是最新版本的Laravel 4,我不能设置Cookie:不能在Laravel 4

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

我找不到任何可以引发或记录错误的地方。我在本地运行Linux Mint,在我的服务器上运行Debian,两者都使用nginx,而且我在两个地方都遇到同样的问题。

回答

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将被设定。

0

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

public function __construct() { 
    $cookie = &$this->cookie; 
    $this->afterFilter(function ($route, $request, $response) use(&$cookie) { 
      if ($cookie) { 
       $response->withCookie($cookie); 
      } 
    }); 
} 
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使用puthttp://v3.golaravel.com/api/class-Laravel.Cookie.html#_put)。

实施例:

Cookie::put('username', 'mojoman', 60 * 24 * 30); // 30 days 
+0

1为排队。使用L4中的队列方法的一个重要注意事项:有两种方法'queued'和'queue'。前者是一个getter,并返回一个已排队的cookie,后者排队一个cookie。如果你不小心调用'queued('name','value')'它将会失败,因为它可以接受2个参数:一个键和一个可选的默认值。 –

+0

链接到文档中的Cookie ::队列:http://laravel.com/docs/requests#cookies – Justin

+0

只适用于此。谢谢 – vuhung3990