Почему Symfony экранирует & символы при использовании url_for ()? - PullRequest
0 голосов
/ 01 августа 2011

На этой странице Symfony я передаю $_GET параметры в URI следующим образом:

http://www.mysite.com/article?page=4&sort=1

Когда в моем макете есть определенные ссылки на странице, которые должны иметь одинаковую строку запросав них.

В любом случае, используя команду url_for() Symfony, я создаю URL-адреса примерно так:

$url = url_for('article/index?.http_build_query($_GET));

Таким образом, он создает новый URL-адрес с помощью переменных $ _GET.Для некоторых ссылок я заранее изменяю значения $ _GET, например, $_GET['sort']=0; перед генерацией URL.Вот почему я использую этот метод.

В любом случае, когда я смотрю на сгенерированный URL, он теперь выглядит так:

http://www.mysite.com/article?page=4&amp%3Bsort=1

&amp%3B - это кодированная форма &, который является просто символом &.

Таким образом, проблема в том, что когда я проверяю свои параметры $ _GET в моем контроллере сейчас, больше не передается параметр sort.Теперь он называется &amp%3Bsort ... Это вызывает всевозможные проблемы.

Два вопроса:

  1. Как избежать этой проблемы?Могу ли я декодировать значения ключа параметра $_GET в моем контроллере или что-то в этом роде?

  2. Почему Symfony кодирует символ & в первую очередь?Это совершенно приемлемый символ URI.Черт, даже закодированное значение, &amp%3B содержит & !!!

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Я полагаю, это из-за того, что экранирование включено в вашем приложении. В результате массив $ _GET помещается в класс sfOutputEscaperArrayDecorator. Вы можете получить необработанное значение, используя это: $_GET->getRawValue().

$url = url_for('article/index?.http_build_query($_GET->getRawValue()))

Или вы можете декодировать результат запроса, используя sfOutputEscaper :: unescape

$url = url_for('article/index?.sfOutputEscaper::unescape(http_build_query($_GET)));

Надеюсь, это будет полезно.

0 голосов
/ 01 августа 2011

Лучше всего, если вы используете собственный метод Symfony для получения параметров запроса.Например, в шаблонах используйте:

$sf_request->getParameter('some_param');

Если вам нужно использовать $ _GET, возможно, попробуйте:

 (((    $sf_data->getRaw('_GET')   )))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...