Symfony2/Twig, связанный с получением строковых значений URL-запроса

Я пытаюсь манипулировать значениями строки запроса в URL-адресе.

Я могу получить текущий URL-адрес или маршрут либо из объекта Request или Twig, но из строки запроса, с которой я борюсь.

Мне не нужен app.request.attributes.get('_ route_params'), так как это получает параметры строки запроса, которые находятся на маршруте.

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

Я хочу иметь возможность сделать две вещи, перечисленные ниже, как в Symfony2 (в контроллере PHP), так и в Twig (в шаблоне Twig):

  1. Получите все текущие значения строки запроса в URL-адресе и отобразите их

  2. Сделайте 1, но измените одно из значений строки запроса перед их отображением

Я не могу найти тех, кто знает, как это сделать.

Ответ 1

Вы можете использовать app.request.query.all для получения строк запроса.

Если вы хотите изменить параметр в Twig, вы можете сделать это

{% set queryParams = app.request.query.all %}
{% set queryParams = queryParams|merge({queryKey: newQueryValue}) %}

Ответ 2

В контроллер

use Symfony\Component\HttpFoundation\Request;

public function fooAction(Request $request)
{
  $params = $request->query->all();
}

пожалуйста, обратите внимание: $request->query->all(); будет возвращать массив с ключами, названными как параметры запроса

В веточку

До тех пор, пока вы переходите от контроллера (читайте это, как всегда), вы можете передать свои параметры таким образом

use Symfony\Component\HttpFoundation\Request;

public function fooAction(Request $request)
{
  $params = $request->query->all();
  return $this->render('MyFooBundle:Bar:foobar.html.twig', array('params' => $params));
}

В ваш шаблон foobar.html.twig вы можете получить доступ ко всем параметрам строки запроса, просто используя переменную params.

например, с этим URL-адресом запроса: http://example.com/?foo=bar&secondfoo=secondbar

{% for paramName, paramValue in params %}
  <div>{{ paramName }}: {{ paramValue }}</div>
{% endfor %}
<div>{{ params.secondfoo }}</div>

выход из пруда:

<div>foo: bar</div>
<div>secondfoo: secondbar</div>
<span>secondbar</span>

Другим методом является использование app.request.query.all в app.request.query.all, не передавая ничего из ветки с вашего контроллера.

Итоговая записка

Если вы хотите изменить один из этих параметров при передаче массива на ветку с вашего контроллера, просто измените одно из значений массива, как и с обычными значениями (например: $params['id'] = $params['id'] - 1;)