2013-04-03 19 views
5

ich die neueste Version von Laravel 4 mit und ich kann keine Cookies:Kann keine Cookies 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')); 
}); 

Script ansehen:

@extends('layouts.master') 

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

Ausbeuten:

Forever cookie: 
Temporary cookie: 
Variable test: works 

Es spielt keine Rolle, ob ich die Seite aktualisiere oder die Cookies auf einer Route erstelle und versuche, in einer anderen auf sie zuzugreifen. Ich kann bestätigen, dass mit der obigen Operation keine Cookies gesetzt werden. Die Cookies 'laravel_payload' und 'laravel_session' sowie 'remember_ [HASH]' existieren und ich kann Cookies mit regulärem PHP unter Verwendung von setcookie setzen.

Keine Fehler werden irgendwo hingeworfen oder protokolliert, die ich finden kann. Ich betreibe Linux Mint lokal und Debian auf meinem Server, beide mit Nginx und ich habe das gleiche Problem an beiden Orten.

Antwort

16

Cookies sind nicht so zu verwenden, sie sind für die nächste Anfrage festgelegt, nicht für die aktuelle Anfrage. Und Sie müssen sie manuell an Ihre Antwort anhängen, wie in der documentation angegeben.

Also dieser Code

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

wird kein Ergebnis bekommen, weil das Cookie nicht am Ende des Antrags angebracht ist.

Sie können es versuchen, es in zwei Routen wie

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

dann erster Zugang yoursite.local/cookieset und dann yoursite.local/cookietest zu sehen, dass es funktioniert auf diese Art und Weise und das Cookie gesetzt wird zu splitten.

0

Mit dem afterFilter kann Cookie im Controller gesetzt werden. Angenommen, der Cookie wird in der Klassenvariablen $ cookie eines Controllers gespeichert. In dem Konstrukteurs-Controller, wird der folgende Code einfügen automatisch das Cookie in dem, was im Hinblick auf Client zurückgegeben:

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

In Laravel 4 wir das erwartete Verhalten Cookie mit queue bekommen.

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

Beispiel:

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

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

Beispiel:

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

+1 für die Warteschlange gestellt. Ein wichtiger Hinweis zur Warteschlangenmethode in L4: Es gibt zwei Methoden 'queued' und' queue'. Ersteres ist ein Getter und gibt einen bereits in die Warteschlange eingereihten Cookie zurück, letzteres stellt einen Cookie in die Warteschlange. Wenn Sie versehentlich 'queueed '(' name ',' value ') aufrufen, wird es automatisch fehlschlagen, da es zwei Parameter akzeptiert: einen Schlüssel und einen optionalen Standardwert. –

+0

Ein Link zu 'Cookie :: queue' in der Dokumentation: http://laravel.com/docs/requests#cookies – Justin

+0

Nur damit arbeiten. danken – vuhung3990