Symfony/Doctrine: Unserialize в действии против шаблона

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

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

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

Но не при вызове непосредственно в шаблоне:

<?php echo unserialize($raw) ?>

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

Спасибо.


person Tom    schedule 25.03.2010    source источник


Ответы (1)


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

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

escaping_strategy:     false

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

Обновлено:

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

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

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

person Amy B    schedule 25.03.2010
comment
@Коронатус ... а, это имеет смысл. Если я отключу стратегию побега, какие еще изменения я могу ожидать? (если это не то, о чем я должен правильно читать) - person Tom; 25.03.2010
comment
Кроме того, мне было бы очень интересно услышать, как это снижает производительность? - person Tom; 25.03.2010