14

何らかの理由で、セッションは私の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」のみが表示されます(ただし、以前に/に戻ることも、トリガーを更新することもないため、実際には保存されません)。

4

1 に答える 1

27

今、手動でセッションを開始する必要があります。

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

サイレックストラッカーにはこれに関するチケットがありますが、まだ考える時間がありません。問題は、これを行うと、すべてのユーザーに対してセッションが作成されることです。セッションを持つことを使用するたびに、すべてのユーザーがCookieを取得することを意味します。これはあなたが望まないかもしれないものです。これが、この時点で自動的に開始されない理由です。

私はそれが物事を少しクリアすることを願っています。

于 2012-03-16T12:20:42.520 に答える