Symfony 1.4: Можно ли предотвратить экранирование URL-адреса перенаправления?

Если я делаю перенаправление в действии как обычно:

$this->redirect('@mypage?apple=1&banana=2&orange=3');

... Symfony выдает правильный URL:

/something/something?apple=1&banana=2&orange=3

Однако по какой-то странной причине экранируется следующее:

$string = 'apple=1&banana=2&orange=3';
$this->redirect('@mypage?'.$string);

... и создается следующий URL-адрес:

/something/something?apple=1&banana=2&orange=3

Есть ли способ избежать этого экранирования и правильно отображать амперсанд в URL-адресе? Я перепробовал все, что мог придумать, и это сводит меня с ума. Мне это нужно для ситуации, когда я извлекаю сохраненный запрос в виде строки из базы данных и просто хочу зафиксировать его на URL-адресе. Я знаю, что могу сгенерировать массив из строки, а затем сгенерировать совершенно новый URL-адрес из массива, но из-за этого глупого экранирования это кажется большим накладным расходом.

Спасибо.


person Tom    schedule 06.04.2010    source источник


Ответы (2)


Когда вы говорите «выглядеть правильно», вы можете упустить тот факт, что & является «правильным» представлением разделителя переменных & в URL-адресах — для правильного формата X(HT)ML & должен быть закодирован как &

Тем не менее, поведение в вашем сценарии необычно, поскольку вы ожидаете одинакового поведения в обоих примерах. Я предполагаю, что это не специфичные для маршрутизации параметры вашего правила маршрутизации, хотя я ожидаю, что symfony по умолчанию уменьшит ваши переменные следующим образом:

/something/something/apple/1/banana/2/orange/3

Это не какая-то странная настройка PHP, которая мешает вашим строкам, не так ли?

EDIT: я протестировал его с symfony 1.3.3, и он урезает переменные, как я и предлагал. Я склонен думать, что это вызвано настройкой PHP/Apache. Проверьте файл php.ini на наличие параметра arg_separator.output.

person Raise    schedule 06.04.2010
comment
@Raise: никаких необычных настроек PHP или чего-то подобного. Под правильным отображением я подразумеваю правильные амперсанды, разделяющие параметры запроса. Прямо сейчас Symfony понимает, что &{banana}={2} означает &{amp;banana}={2}, что совершенно неверно. - person Tom; 07.04.2010
comment
Разрезание... да, это будет проходить через ассоциации routing.yml. Однако у меня есть 25 связанных вместе переменных, которые я не хочу объявлять в маршрутизации, а просто хочу сохранить как строку запроса GET для дальнейших манипуляций. - person Tom; 07.04.2010

Я считаю, что это ваш лучший выбор.

$url = $this->getController()->genUrl('search/list');
$this->redirect($url.'?q='.$q.'&g='.$g);

У меня это отлично работает (символы & не экранируются в &)

person Matt Sidesinger    schedule 29.05.2010