【问题标题】:Sessions do not work in Silex\App会话在 Silex\App 中不起作用
【发布时间】:2012-04-01 20:03:28
【问题描述】:

无论出于何种原因,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() 之间切换,但无济于事。

我不知道在哪里寻找问题......

这是我写的一个非常简单的测试应用程序(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>

转到/什么都不显示,转到/test时只显示“get:test”(但实际上没有存储,因为之前既没有返回/也没有刷新触发器)。

【问题讨论】:

  • 请尝试在顶部添加:$app-&gt;before(function ($request) { $request-&gt;getSession()-&gt;start(); });
  • @igorw 谢谢,成功了。我猜是没有看到树木的树木。我已经习惯了使用 Zend 框架在幕后启动会话,我什至没有考虑手动启动它,
  • 让我重新发布这个作为答案。

标签: php session silex


【解决方案1】:

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

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

silex tracker里面有关于这个的ticket,我还没来得及想。问题是,如果您这样做,您将为每个用户创建一个会话。每次使用都有一个会话,意味着每个用户都会获得 cookie。这是你可能不想要的。这就是它此时没有自动启动的原因。

我希望这能把事情弄清楚一点。

【讨论】:

  • 在我的场景中,为每个用户使用一个会话是可以接受的,所以我不介意。再次感谢您的回答和澄清。
  • 请将此添加到 Silex 文档中!我刚刚花了一个小时研究 Symfony Session 代码,试图弄清楚这一点。
  • @igorw,silex 还受这个问题影响吗?
  • 为什么不再需要了?
  • 这仍然是必需的。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多