2013-04-03 96 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