Symfony2/Twig, связанный с получением строковых значений URL-запроса
Я пытаюсь манипулировать значениями строки запроса в URL-адресе.
Я могу получить текущий URL-адрес или маршрут либо из объекта Request или Twig, но из строки запроса, с которой я борюсь.
Мне не нужен app.request.attributes.get('_ route_params'), так как это получает параметры строки запроса, которые находятся на маршруте.
Мне нужно получить параметры строки запроса, которые на самом деле находятся в URL-адресе.
Я хочу иметь возможность сделать две вещи, перечисленные ниже, как в Symfony2 (в контроллере PHP), так и в Twig (в шаблоне Twig):
-
Получите все текущие значения строки запроса в URL-адресе и отобразите их
-
Сделайте 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;
)