2012-03-16 2 views
13

По какой-то причине сеансы не работают в моем Silex-приложении. Я устанавливаю error_reporting в моем php.ini до E_ALL | E_STRICT, и ошибки отображаются и регистрируются. Ничего не видно. Но по какой-то причине сеанс не создается, и нет файла в /project-root/tmp/sessions/ (а также нет, когда используется по умолчанию session.save_path). Переключение на PdoSessionStorage, чтобы исключить проблемы с разрешениями на чтение и запись в файловой системе, также не принесло результатов. Я также попытался переключиться между $app['session'], $request->getSession() и $app['request']->getSession() безрезультатно.Сессии не работают в Silex App

Я в недоумении, где еще искать проблемы ...

Вот очень простой тест-приложение, которое я написал (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> 

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

+2

Попробуйте добавить это вверху: '$ app-> before (function ($ request) {$ request-> getSession() -> start();});' – igorw

+0

@igorw Спасибо, это сделало трюк , Наверное, я не видел дерева для деревьев. Я так привык к тому, что сеанс запущен за сценой из работы с Zend Framework, что я даже не думал о том, чтобы вручную запустить его, – dbrumann

+0

Позвольте мне повторно опубликовать это как ответ. – igorw

ответ

26

Прямо сейчас Вы должны начать сеанс вручную:

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

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

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

+0

В моем сценарии использование сеанса для каждого пользователя приемлемо, поэтому я не против. Еще раз спасибо, как за ответ, так и за разъяснения. – dbrumann

+5

Пожалуйста, добавьте это в документы Silex! Я просто потратил час, прокручивая код Symfony Session, пытаясь понять это. – yitznewton

+0

@igorw, silex по-прежнему страдает от этой проблемы? – Federkun

Смежные вопросы