#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 на переднем веб-контроллере в самую последнюю минуту, я вижу, что:
-
Когда действие, которое не является «setCulture», все идет хорошо (т. Е. Сеанс получает предыдущий модуль и действие, как и должно быть)
-
Когда выполняется действие ‘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 при использовании в фильтрах.
В итоге я создал свой собственный механизм фильтрации, который выполняет действия для всего приложения.
Итак, чтобы уточнить, мой выбор был:
- создайте класс, автоматически загружаемый в корневую папку библиотеки, который имеет статический метод с именем ‘fe_app_init’
- добавьте метод preExecute к действиям каждого модуля в приложении FE, который использует fe_app_init из этого класса
Теперь fe_app_init() правильно обрабатывает значения в сеансе.
Жаль, что в Symfony 1.4 есть такой инструмент, как фильтры, но затем он портит сеанс и обработку файлов COOKIE в них.