2013-04-03 19 views
5

Tôi đang sử dụng phiên bản mới nhất của Laravel 4 và tôi không thể thiết lập cookie:Không thể đặt cookie trong 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')); 
}); 

Xem kịch bản:

@extends('layouts.master') 

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

Sản lượng:

Forever cookie: 
Temporary cookie: 
Variable test: works 

Không quan trọng nếu tôi làm mới trang hoặc tạo cookie trong một tuyến đường và cố gắng truy cập chúng trong một tuyến đường khác. Tôi có thể xác nhận rằng không có cookie nào được thiết lập với thao tác trên. Các cookie 'laravel_payload' và 'laravel_session' cũng như 'remember_ [HASH]' tồn tại và tôi có thể đặt cookie bằng PHP thông thường bằng setcookie.

Không có lỗi nào được ném hoặc đăng nhập ở bất kỳ đâu mà tôi có thể tìm thấy. Tôi đang chạy Linux Mint cục bộ và Debian trên máy chủ của tôi, cả với nginx và tôi có cùng một vấn đề ở cả hai nơi.

Trả lời

16

Cookie không được sử dụng như thế này, chúng được đặt cho yêu cầu tiếp theo, không phải cho yêu cầu hiện tại. Và bạn phải tự đính kèm chúng vào Phản hồi của bạn, như đã nêu trong documentation.

Vì vậy, mã này

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

sẽ không nhận được kết quả vì các tập tin cookie không được gắn ở phần cuối của yêu cầu.

Bạn có thể thử nó bằng cách chia nó thành hai tuyến đường như

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

sau đó truy cập đầu tiên và sau đó yoursite.local/cookiesetyoursite.local/cookietest để thấy rằng nó hoạt động theo cách này và cookie sẽ được thiết lập.

0

Bộ lọc sau có thể được sử dụng để đặt Cookie trong bộ điều khiển. Giả sử cookie được lưu trữ trong biến $ class của biến điều khiển. Trong constructor của bộ điều khiển, đoạn code sau sẽ tự động chèn các tập tin cookie vào bất cứ cái nhìn trở lại cho khách hàng:

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

trong Laravel 4 chúng tôi nhận được hành vi Cookie mong đợi với queue.

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

Ví dụ:

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

Warning: Trong Laravel 3 sử dụng put (http://v3.golaravel.com/api/class-Laravel.Cookie.html#_put).

Ví dụ:

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

+1 cho xếp hàng đợi. Một lưu ý quan trọng với phương thức xếp hàng trong L4: Có hai phương thức 'queueued' và' queue'. Trước đây là một getter và trả về một cookie đã được xếp hàng đợi, sau đó xếp hàng một cookie. Nếu bạn vô tình gọi 'xếp hàng đợi ('name', 'value')' nó sẽ thất bại âm thầm vì nó có thể chấp nhận 2 params: một khóa và một mặc định tùy chọn. –

+0

Một liên kết đến 'Cookie :: queue' trong tài liệu: http://laravel.com/docs/requests#cookies – Justin

+0

Chỉ làm việc với điều này. cảm tạ – vuhung3990