Сессии не работают в Silex \ App - PullRequest
13 голосов
/ 16 марта 2012

По какой-то причине сеансы не работают в моем приложении Silex.Я установил error_reporting в моем php.ini на 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» (но на самом деле не сохраняется, так как не возвращается и не обновляет триггеры раньше).

1 Ответ

26 голосов
/ 16 марта 2012

Прямо сейчас вам нужно запустить сеанс вручную:

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

Есть билеты по этому поводу в Silex-трекере, у меня еще не было времени подуматьПроблема в том, что если вы сделаете это, вы создадите сеанс для каждого пользователя.Каждое использование имеет сеанс, означает, что каждый пользователь получает куки.Что-то, что вы можете не хотеть.Именно поэтому он не запускается автоматически в этот момент.

Надеюсь, это немного прояснит ситуацию.

...