Symfony. Экранирования переменных. Массивы в action превращаются в sfOutputEscaperArrayDecorator в template

февраля
03
2012
Метки: escaping symfony

В Symfony распространенной проблемой является то, что массивы, которые передаются от action в template превращаются в sfOutputEscaperArrayDecorator. А в шаблоне все функции для работы с массивами перестают работать из-за того, что тип переменной sfOutputEscaperArrayDecorator, а не array. Рассмотрим несколько вариантов отключения экранирования, что является причиной подобного поведения Symfony.

1. Отключение экранирования во всем проекте

Чтобы отключить экранирование во всем проекте необходимо в файле /apps/frontend/config/settings.yml установить переменную escaping_strategy в false:


all:
   escaping_strategy:    false

Мы не рекомендуем отключать экранирование во всем проекте. Эта функция помогает избежать множества ошибок и обезопасить приложение.

2. Отключение экранирования в одном action

Второй способ - отключение экранирования всех переменных в одном action'е. Делается это следующим способом:


public function executeShow(sfWebRequest $request)
{
  sfConfig::set('sf_escaping_strategy', false);
}

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

3. Отключение экранирования переменной

Третий, традиционный способ, - отключение экранирования конкретной переменной. Это делается с помощью выражения $sf_data->getRaw("имя_переменной"). Например, в Вашем action есть массив test:


...
this->test = array('first', 'second', 'third');
...

Для того, чтобы в template получить переменную test, которая не подверглась экранизации, необходимо использовать следующее выражение $sf_data->getRaw('test'):


$test; // экранированная переменная test

$sf_data->getRaw('test'); // оригинальная неэкранированная переменная test

$object->getName(ESC_RAW); // таким образом отключается экранирование метода класса

Последний способ является наиболее приемлемым в реальных проектах.

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии