2012-03-16 37 views
13

Vì bất kỳ lý do gì, Phiên không hoạt động trong ứng dụng Silex của tôi. Tôi đặt error_reporting trong php.ini của tôi thành E_ALL | E_STRICT và các lỗi được hiển thị và ghi lại. Không có gì để xem ở đó. Nhưng vì một số lý do không có phiên nào được tạo và không có tệp nào trong /project-root/tmp/sessions/ (và cũng không phải, khi sử dụng session.save_path mặc định). Chuyển sang PdoSessionStorage, để loại trừ các vấn đề với quyền đọc/ghi trên hệ thống tập tin, cũng không mang lại kết quả nào. Tôi cũng đã thử chuyển đổi giữa $app['session'], $request->getSession()$app['request']->getSession() vô ích.Phiên không hoạt động trong Silex App

Tôi đang ở một mất mát như những nơi khác để tìm kiếm các vấn đề ...

Dưới đây là một thử nghiệm ứng dụng rất đơn giản, tôi đã viết (use được bỏ qua để tiết kiệm không gian). Về cơ bản thử nghiệm này cho thấy những gì tôi cố gắng đạt được trong ứng dụng thực tế của tôi. Tôi muốn lưu trữ một mảng trong phiên. Trong $app->before() Tôi kiểm tra xem giá trị đã được đặt chưa rồi chuyển giá trị đó đến giá trị được hiển thị, ví dụ: thông tin đăng nhập: You are logged in as {{ user.name }}:

$app = new Application; 
$app['debug'] = true; 
$app->register(new SessionServiceProvider, array(
    'session.storage.save_path' => dirname(__DIR__) . '/tmp/sessions' 
)); 
$app->register(new TwigServiceProvider, array(
    'twig.path' => __DIR__ . '/views' 
)); 

$app->before(function (Request $request) use ($app) { 
// if ($app['debug'] == true) { 
//  $request->getSession()->set('test', array('key' => 'value')); 
// } 
    if ($request->hasPreviousSession() && $request->getSession()->has('test')) { 
     $test = $request->getSession()->get('test'); 
     if ($test !== null) { 
      $app['twig']->addGlobal('before', $test); 
     } 
    } 
}); 

$app->get('/', function() use ($app) { 
    return $app['twig']->render('sessiontest.twig'); 
}); 
$app->get('/test', function() use ($app) { 
    $app['session']->set('test', array('key' => 'value')); 
    return $app['twig']->render('sessiontest.twig', 
     array('get' => $app['session']->get('test'))); 
}); 
$app->run(); 

sessiontest.twig trông như thế này:

<html> 
<head><title>test</title></head> 
<body> 
    {% if before is defined %}before: {{ before.key }}{% endif %} 
    {% if get is defined %}get: {{ get.key }}{% endif %} 
</body> 
</html> 

Khi đi/không có gì được hiển thị, khi đi đến/kiểm tra chỉ "nhận được: kiểm tra" được hiển thị (nhưng không thực sự được lưu trữ, vì không trả về/cũng không làm mới các trigger trước đây).

+2

Hãy thử thêm điều này ở trên cùng: '$ app-> before (function ($ request) {$ request-> getSession() -> start();});' – igorw

+0

@igorw Cảm ơn, điều đó đã làm . Tôi không thấy gỗ cho cây, tôi đoán vậy. Tôi rất quen với phiên được bắt đầu đằng sau hậu trường từ làm việc với Zend Framework, rằng tôi thậm chí không nghĩ đến việc khởi động nó theo cách thủ công, – dbrumann

+0

Hãy để tôi đăng lại câu trả lời này như một câu trả lời sau đó. – igorw

Trả lời

26

Ngay bây giờ bạn cần phải bắt đầu phiên giao dịch bằng tay:

$app->before(function ($request) { 
    $request->getSession()->start(); 
}); 

Có vé về vấn đề này trong bộ theo dõi silex, tôi đã không có thời gian để suy nghĩ về nó được nêu ra. Vấn đề là nếu bạn làm điều này, bạn sẽ tạo một phiên cho mọi người dùng. Mỗi sử dụng có một phiên, có nghĩa là mọi người dùng đều nhận được cookie. Đó là điều bạn có thể không muốn. Đó là lý do tại sao nó không được bắt đầu tự động vào thời điểm này.

Tôi hy vọng sẽ xóa mọi thứ một chút.

+0

Trong kịch bản của tôi, sử dụng một phiên cho mỗi người dùng là chấp nhận được, vì vậy tôi không quan tâm. Cảm ơn một lần nữa, cả cho câu trả lời và làm rõ. – dbrumann

+5

Vui lòng thêm tài liệu này vào tài liệu Silex! Tôi đã dành một giờ chơi game thông qua mã Symfony Session để tìm ra điều này. – yitznewton

+0

@ strongw, silex vẫn bị ảnh hưởng bởi vấn đề này? – Federkun

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