无论出于何种原因,Sessions都无法在我的Silex-app中运行。我将php.ini中的error_reporting设置为E_ALL | E_STRICT
,并显示和记录错误。没什么好看的。但由于某种原因,没有创建会话且/project-root/tmp/sessions/
中没有文件(当使用默认的session.save_path时也没有)。切换到PdoSessionStorage,以排除文件系统的读/写权限问题,也没有带来任何结果。我也尝试在$app['session']
,$request->getSession()
和$app['request']->getSession()
之间切换无效。
我不知道在哪里寻找问题......
这是我写的一个非常简单的测试应用程序(省略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>
当进入/无显示时,进入/测试时只显示“get:test”(但实际上没有存储,因为之前都没有返回/也没有刷新触发器。)
答案 0 :(得分:26)
现在您需要手动启动会话:
$app->before(function ($request) {
$request->getSession()->start();
});
在silex跟踪器中有关于此的门票,我还没有时间考虑它。问题是如果你这样做,你将为每个用户进行一次会话。每个使用会话的人都意味着每个用户都会获得cookie。这是你可能不想要的东西。这就是为什么它不会在此时自动启动的原因。
我希望稍微澄清一下。