2016-01-23 15 views
7

Tôi có cài đặt mới của Laravel 5, trên thực tế tôi đã thử phiên bản này trên nhiều phiên bản và tiếp tục gặp vấn đề tương tự.Phiên bản Laravel 5.2.10 của tôi không tồn tại

Tôi chưa thay đổi gì từ cài đặt mặc định trừ khi đặt trình điều khiển phiên làm lại. (File dựa cũng có cùng một vấn đề).

Tôi có hai tuyến đường thiết lập như sau

Route::get('/set/{value}', function($value) { 
    var_dump(Session::getId()); 
    Session::set('test', $value); 
    return view('welcome'); 
}); 

Route::get('/get', function() { 
    return 'Get ' . Session::get('test'); 
}); 

Nếu tôi truy cập vào url/set/abc tôi thấy phiên xuất hiện trong REDIS (Tôi cũng thấy các tập tin được tạo ra khi sử dụng tập tin dựa). Phiên giao dịch có vẻ ổn trong REDIS như được hiển thị bên dưới

127.0.0.1:6379> KEYS * 
1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b" 
2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c" 
3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d" 

Mỗi lần tôi truy cập trang, nó sẽ tạo lại một phiên mới.

Các bộ phận quan trọng của tập tin session.php là như sau:

'lifetime' => 120, 

'expire_on_close' => false, 

Tôi cũng đã kiểm tra trong REDIS TTL của các biến session và họ được khởi tạo ở 120 phút (tương đương tính bằng giây).

Bất kỳ ý tưởng nào tôi đang làm sai?

Có thể đáng chú ý là tôi đang sử dụng vm nhà cửa (chứng khoán hoàn toàn) để kiểm tra điều này. Tôi cũng đã thử sử dụng nhiều trình duyệt. Không có cookie nào được gửi tới trình duyệt, tôi cho rằng id phiên sẽ được gửi tới trình duyệt như một phần của yêu cầu nhận ban đầu?

+0

đó là thực sự kỳ lạ ... Tôi đang cố gắng để tái tạo hành vi cục bộ.Tôi tự hỏi liệu phương thức 'getId' có làm gì đó khó chịu không? – FBidu

+0

@FBidu Tôi đã thử và không có hàm getId, nó dường như không ảnh hưởng đến nó theo bất kỳ cách nào, tôi nhận được cùng một hành vi kỳ quặc. –

+0

@FBidu Trên thực tế ['getId'] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Session/Store.php#L162-L165) thực hiện những gì nó ngụ ý và không có gì hơn:). – Bogdan

Trả lời

6

Lớp trung gian của Laravel \Illuminate\Session\Middleware\StartSession có trách nhiệm bắt đầu phiên của bạn. Trước L5.2, điều này chạy trên mọi yêu cầu vì nó là một phần của ngăn xếp trung gian toàn cầu. Bây giờ, nó là tùy chọn vì L5.2 muốn cho phép cả giao diện người dùng web và API trong cùng một ứng dụng.

Nếu bạn mở app/Http/Kernel.php, bạn sẽ thấy rằng phần mềm trung gian StartSession là một phần của nhóm trung gian có tên là web. Bạn cần phải đặt tất cả các tuyến đường của bạn bên trong cho ví dụ của bạn để làm việc.

Route::group(['middleware' => ['web']], function() { 
    Route::get('/set/{value}', function($value) { 
     var_dump(Session::getId()); 
     Session::set('test', $value); 
     return view('welcome'); 
    }); 

    Route::get('/get', function() { 
     return 'Get ' . Session::get('test'); 
    }); 
}); 

Bạn có thể thấy rằng các nhóm middleware web cũng chịu trách nhiệm cho những thứ khác như cung cấp các biến $errors trên tất cả các quan điểm.

Bạn có thể đọc thêm về nó trong các tài liệu:

Theo mặc định, các tập tin routes.php chứa một tuyến đường duy nhất cũng như một nhóm tuyến đường áp dụng các nhóm web middleware cho tất cả các tuyến đường mà nó chứa. Nhóm middleware này cung cấp bảo vệ trạng thái phiên và CSRF cho các tuyến.

Mọi tuyến đường không được đặt trong nhóm trung gian web sẽ không có quyền truy cập vào phiên và bảo vệ CSRF, vì vậy hãy đảm bảo mọi tuyến đường cần các tính năng này được đặt trong nhóm. Thông thường, bạn sẽ đặt hầu hết các tuyến đường của bạn trong nhóm này:

Nguồn: https://laravel.com/docs/5.2/routing

+0

Brilliant, cảm ơn Thomas, tôi may mắn nhận được câu trả lời tương tự từ một chàng trai trên github ngay trước khi bạn đăng :), bạn là cả hai người cứu sống. –

+0

Oh okay. :) Tôi rất vui vì bạn đã sắp xếp nó. –

+0

Tôi đang gặp vấn đề tương tự. Mặc dù tuyến đường của tôi nằm trong một nhóm trong nhóm có phần tử trung gian 'web'. Vì vậy, không nên tuyến đường của tôi được dưới middleware web? – majidarif

Các vấn đề liên quan