2010-03-25 2 views
0

Может ли кто-нибудь сказать мне, почему вызов «unserialize» отлично работает в действии, но дает ошибку смещения в шаблоне?Symfony/Doctrine: Unserialize in action vs template

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

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

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

<?php echo unserialize($raw) ?> 

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

Спасибо.

ответ

3

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

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

escaping_strategy:  false 

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

Обновлено:

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

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

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

+0

@Coronatus ... ах, это имеет смысл. Если я выключу стратегию экранирования, что еще я могу ожидать изменить? (если это не то, что я должен правильно читать) – Tom

+1

Кроме того, мне было бы очень интересно узнать, как это убивает производительность? – Tom

+0

Большое спасибо. – Tom