Symfony — Почему некоторые переменные экранируют выходные данные, а другие нет?

#symfony1 #symfony-1.4

#symfony1 #symfony-1.4

Вопрос:

В представлении Symfony 1.4, почему некоторые переменные экранируют выходные данные, а другие нет?

У меня есть escaping_strategy = true и escaping_method = ESC_SPECIALCHARS.

Если я сделаю

 $this->form = new SearchForm();
  

тогда, на мой взгляд, $form будет формой поиска. Или объекты модели также, похоже, проходят как обычные объекты модели.

Но другие переменные, такие как массивы или MongoCursor , преобразуются в объекты sfOutputEscaper___Decorator , и я не могу получить прямой доступ к необработанным методам. Почему?

Я понимаю, что могу получить исходную переменную, а затем использовать ее методы, но сейчас для меня это игра в угадайку, что расстраивает.

Ответ №1:

Существует множество классов, которые будут пропускать любые экранирования выходных данных (потому что они в основном отображают HTML). По умолчанию sfView.class.php пометит следующее как безопасное:

sfForm, sfFormField, sfFormFieldSchema, sfModelGeneratorHelper

Таким образом, объекты этих классов или наследующие от них, не будут экранированы на выходе.

Если вы посмотрите на соответствующий код в sfView.class.php вы также найдете, как пометить дополнительные классы как безопасные, если вы хотите это сделать:

 sfOutputEscaper::markClassesAsSafe(array('sfForm', 'sfFormField', 'sfFormFieldSchema', 'sfModelGeneratorHelper'));
  

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

1. А, спасибо. Я также вижу, что сбивало меня с толку … sfOutputEscaperObjectDecorator выполняет волшебный метод __call, который заставлял меня думать, что он не экранируется. Но мои вызовы count() возвращали 1. Это потому, что он не вызывал метод count() MongoCursor, потому что у sfOutputEscaperObjectDecorator есть свой собственный!