Symfony / Doctrine: десериализация в действии против шаблона - PullRequest
0 голосов
/ 25 марта 2010

Может кто-нибудь сказать мне, почему вызов "unserialize" прекрасно работает в действии, но дает ошибку смещения в шаблоне?

Как правило, можно десериализовать текстовый результат базы данных в переменную в действии и передать его в шаблон, в этом случае он отображается нормально:

$this->clean = unserialize($this->raw);
<?php echo $clean ?>

Но не при вызове напрямую в шаблоне:

<?php echo unserialize($raw) ?>

Было бы интересно узнать, почему это так и есть ли обходной путь.

Спасибо.

1 Ответ

3 голосов
/ 25 марта 2010

Symfony помещает все переменные шаблона в класс sfOutputEscaperArrayDecorator. Поэтому, когда вы пишете unserialize($var), вы на самом деле пытаетесь десериализовать класс sfOutputEscaperArrayDecorator.

Я рекомендую отключить экранирование выхода в settings.yml:

escaping_strategy:     false

Это глупая, убивающая производительность, ненужная особенность Symfony, которую нужно убить.

Обновлено :

Если вы отключите escaping_strategy, вам нужно будет вручную экранировать ввод от пользователей (для предотвращения XSS) с помощью htmlSpecialCharacters().

Класс Symfony делает это за вас, но это означает, что он также экранирует все числа и символы - 99% из них, как вы уже знаете, будут безопасными (идентификаторы, даты, ваш собственный контент). Когда я отключил автоматическое экранирование, загрузка моего сервера значительно упала.

Имейте в виду, что Symfony дважды применяет это автоматическое экранирование, если вы передаете sfOutputEscaperArrayDecorator частичному, то есть > станет &amp;gt;

...