Подтвердить что ты не робот

Сессии не работают в Silex\App

По какой-то причине сеансы не работают в моем 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>

При переходе в/ничего не отображается, при переходе/тестировании отображается только "get: test" (но фактически не хранится, так как ни один из них не возвращался/не обновлял триггеры раньше).

4b9b3361

Ответ 1

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

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

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

Я надеюсь, что это немного облегчит.