Потерянные значения сеанса Symfony

#php #session #caching #symfony1 #filter

#php #сеанс #кэширование #symfony1 #Фильтр

Вопрос:

У меня возникла проблема с обработкой значений сеанса symfony.

По сути, проблема заключается в следующем: у меня активирован фильтр действий, который принимает значения выполняемого модуля и действия и сохраняет их в суперглобальном сеансе.

Это код моего фильтра:

<——НАЧАТЬ КОД—————->

 class getPrevModuleActionFilter extends sfFilter 
{ 
  public function execute ($filterChain) 
  { 
    //---------------Code to execute *BEFORE THE ACTION* execution---------------       
    if ($this->isFirstCall()) # Execute this filter only once
    {
      // Filters don't have direct access to request amp; user objects => Use context object to get them
      $request = $this->getContext()->getRequest();
      $user    = $this->getContext()->getUser();

      if($request->getParameter('action') !== "setCulture")
      {        
        $_SESSION['prev_module'] = "M=".$request->getParameter('module');
        $_SESSION['prev_action'] = "A=".$request->getParameter('action');
      }
    }
    //---------------Execute next filter in the chain--------------- 
    $filterChain->execute(); 

    //---------------Code to execute *AFTER THE ACTION* execution, before the rendering---------------
    //(...)

  }
}
  

<—— КОНЕЧНЫЙ КОД—————->

Странно то, что если я выполняю print_r на переднем веб-контроллере в самую последнюю минуту, я вижу, что:

  1. Когда действие, которое не является «setCulture», все идет хорошо (т. Е. Сеанс получает предыдущий модуль и действие, как и должно быть)

  2. Когда выполняется действие ‘setCulture’: Symfony сохраняет в сеансе следующие значения:

     Array ( 
        [prev_module] => M= 
        [prev_action] => A=    
        (etc)
    )
      

    т. Е. Он теряет значения сеанса для этих 2 записей.

Я пытался использовать разные пространства имен, я пытался использовать setAttribute symfony из sfUser для обработки значений сеанса. В конце я попробовал необработанную обработку сеанса PHP. По-видимому, кажется, что методы завершения работы фабрик, связанные с пользователем и хранением значений сеанса, искажают значения сеанса!

Мне нужна ваша помощь, пожалуйста.

ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ:

  • Версия Symfony: 1.4.6
  • PHP: 5.3
  • У меня отключен кеш Symfony
  • Я запускаю код с frontend_dev.php контроллер

Комментарии:

1. Не уверен, что я вас правильно понял, но где вы устанавливаете prev_module и prev_action, если не выполняется setCulture?

2. Привет, Тамас 🙂 На самом деле, первое выполняемое действие — это не setCulture (это home / index), поэтому я уверен, что prev_mudule и prev_action получают свои соответствующие значения. Затем я запрашиваю действие setCulture, и ничего не выполняется …. но значения из сеанса теряются! Есть идеи? (спасибо)

3. Из моих тестов я почти уверен, что symfony портит суперглобальный СЕАНС, если к этому массиву обращаются в области фильтров. При доступе в actions точно такой же код выполняется плавно, без потери значений СЕАНСА. Странно! Я перепробовал почти все, даже посмотрел в sfSessionStorage.class.php чтобы найти, где он теряет значения из сеанса. Еще одна вещь, когда этот код выполняется в фильтрах, я проверил сеанс для php-скрипта для symfony на сервере, и эти переменные теряют свое значение, но на самом деле находятся в сеансе! хммм…. Я потерян!

4. Я должен добавить, что проблема возникает не только с сеансом, но и с файлами COOKIE!!! Странное поведение при использовании файлов COOKIE и в фильтрах….

Ответ №1:

Ну, я думаю, Symfony портит СЕАНС и файлы COOKIE при использовании в фильтрах.

В итоге я создал свой собственный механизм фильтрации, который выполняет действия для всего приложения.

Итак, чтобы уточнить, мой выбор был:

  1. создайте класс, автоматически загружаемый в корневую папку библиотеки, который имеет статический метод с именем ‘fe_app_init’
  2. добавьте метод preExecute к действиям каждого модуля в приложении FE, который использует fe_app_init из этого класса

Теперь fe_app_init() правильно обрабатывает значения в сеансе.

Жаль, что в Symfony 1.4 есть такой инструмент, как фильтры, но затем он портит сеанс и обработку файлов COOKIE в них.