2013-04-03 13 views
5

sto utilizzando l'ultima versione di laravel 4 e non riesco a impostare i cookie:Impossibile impostare i cookie in 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')); 
}); 

Vista script:

@extends('layouts.master') 

@section('content') 
    Forever cookie: {{ $forever }} <br /> 
    Temporary cookie: {{ $temporary }} <br /> 
    Variable test: {{ $variableTest }} 
@stop 

Resa:

Forever cookie: 
Temporary cookie: 
Variable test: works 

Non importa se aggiorno la pagina o creo i cookie in una rotta e provo ad accedervi in ​​un'altra. Posso confermare che nessun cookie viene impostato con l'operazione precedente. I cookie "laravel_payload" e "laravel_session" e "remember_ [HASH]" esistono e posso impostare i cookie con PHP regolare usando setcookie.

Nessun errore viene emesso o registrato da nessuna parte che posso trovare. Sto usando Linux Mint localmente e Debian sul mio server, entrambi con nginx e ho lo stesso problema in entrambi i posti.

risposta

16

I cookie non sono pensati per essere utilizzati in questo modo, sono impostati per la richiesta successiva, non per la richiesta corrente. E devi allegarli manualmente alla tua risposta, come indicato nello documentation.

Quindi questo codice

Cookie::forever('cookie', 'value'); 
$cookie = Cookie::get('cookie'); 

otterrà alcun risultato perché il cookie non è attaccato alla fine della richiesta.

si può provare dividendolo in due percorsi come

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')); 
}); 

allora primo accesso yoursite.local/cookieset e poi yoursite.local/cookietest per vedere che funziona in questo modo e il cookie verrà impostato.

0

Il filtro successivo può essere utilizzato per impostare Cookie nel controller. Supponendo che il cookie sia memorizzato nella variabile di classe $ cookie del controllore. Nel costruttore del controller, il seguente codice inserirà automaticamente il cookie in qualunque vista restituito al cliente:

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

In laravel 4 otteniamo il comportamento biscotto previsto con queue.

// Set a cookie before a response has been created 
Cookie::queue('key', 'value', 'minutes'); 

Esempio:

Cookie::queue('username', 'mojoman', 60 * 24 * 30); // 30 days 

Warning: In laravel 3 uso put (http://v3.golaravel.com/api/class-Laravel.Cookie.html#_put).

Esempio:

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

+1 per coda. Una nota importante con il metodo della coda in L4: Esistono due metodi 'in coda' e' coda'. Il primo è un getter e restituisce un cookie già in coda, il secondo accoda un cookie. Se accidentalmente chiamate 'queued ('name', 'value')' fallirà silenziosamente perché può accettare 2 parametri: una chiave e un default opzionale. –

+0

Un collegamento a 'Cookie :: queue' nei documenti: http://laravel.com/docs/requests#cookies – Justin

+0

Funziona solo con questo. grazie – vuhung3990