2012-03-16 47 views
13

無論出於何種原因,Sessions都不能在我的Silex應用中運行。我在我的php.ini中設置了error_reporting到E_ALL | E_STRICT,並顯示並記錄了錯誤。沒有什麼可以看到的。但由於某種原因,沒有創建會話,並且/project-root/tmp/sessions/中沒有文件(當使用默認的session.save_path時,也沒有文件)。切換到PdoSessionStorage,排除文件系統讀/寫權限的問題,也沒有帶來任何結果。我也嘗試在$app['session'],$request->getSession()$app['request']->getSession()之間切換,無濟於事。會話在Silex App中不起作用 App

我在茫然,還有什麼地方查找問題...

這是一個非常簡單的測試應用程序,我寫的(use被省略以節省空間)。基本上這個測試顯示了我在實際應用中試圖達到的目標。我想在會話中存儲數組。在$app->before()我檢查是否設置了該值,然後將它傳遞給要顯示的樹枝,例如登錄信息: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看起來是這樣的:

<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> 

到/不顯示任何內容,將/測試時,僅 「得到:測試」 會當顯示(但不實際存儲,因爲既沒有返回到/也沒有刷新觸發器)。

+2

請嘗試在頂部添加:'$ app-> before(function($ request){$ request-> getSession() - > start();});' – igorw 2012-03-16 11:06:36

+0

@igorw謝謝, 。我想,沒有看到樹木。我很習慣Zend Framework後臺開始的會話,我甚至沒有想過手動啓動它, – dbrumann 2012-03-16 11:28:03

+0

讓我重新發布這個作爲答案。 – igorw 2012-03-16 12:19:00

回答

26

現在你需要手動啓動會話:

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

裏有硅石跟蹤這個票,我還沒有來得及尚未考慮一下。問題是,如果你這樣做,你會爲每個用戶開一個會話。每使用一次會話,都意味着每個用戶都得到cookies。這可能是你不想要的。這就是爲什麼它不會自動啓動的原因。

我希望能清理一些東西。

+0

在我的情況下,爲每個用戶使用會話是可以接受的,所以我不介意。再次感謝您的答覆和澄清。 – dbrumann 2012-03-16 12:45:31

+5

請將此添加到Silex文檔!我花了一個小時探討Symfony會話代碼,試圖弄清楚這一點。 – yitznewton 2012-03-19 03:12:50

+0

@igorw,silex仍然受此問題影響? – Federkun 2012-07-18 20:43:58