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); // таким чином відключається екранування методу класу

Останній спосіб є найбільш прийнятним у реальних проектах.

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі