会话在Silex\App中不起作用

dbr*_*ann 13 php session silex

无论出于何种原因,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();
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

当显示/不显示时,当进入/测试时,仅显示"get:test"(但实际上没有存储,因为之前都没有返回/也没有刷新触发器).

igo*_*orw 26

现在您需要手动启动会话:

$app->before(function ($request) {
    $request->getSession()->start();
});
Run Code Online (Sandbox Code Playgroud)

在silex跟踪器中有关于此的门票,我还没有时间考虑它.问题是如果你这样做,你将为每个用户进行一次会话.每个使用会话的人都意味着每个用户都会获得cookie.这是你可能不想要的东西.这就是为什么它不会在此时自动启动的原因.

我希望稍微澄清一下.

  • 请将此添加到Silex文档中!我花了一个小时探索Symfony Session代码,试图解决这个问题. (5认同)
  • 为什么这不再需要? (2认同)