Symfony 2 Forward Request, проходящий по параметрам GET/POST
Можно ли переслать запрос, пройдя все параметры GET/POST?
Я думаю, если я просто сделаю
$this->forward('dest')
Я перейду к dest
без каких-либо параметров GET/POST?
UPDATE
Моя цель состоит в том, чтобы иметь действие контроллера, например addSomething
, которое принимает проверки, что у пользователя есть достаточные "элементы" для добавления чего-либо. Затем переадресуйте запрос контроллеру-ассистенту, чтобы продолжить фактическое добавление {Type} Something
Или получилось бы "проверка" сервиса во всех контроллерах, что делает проверку более подходящей? В любом случае, я думаю, что он информативен, чтобы знать, как перенаправить действие контроллера со всеми параметрами
Ответы
Ответ 1
Я не вижу здесь никакой причины перенаправлять запрос обратно через ядро. Вы можете пойти по пути инкапсуляции этой логики в службу проверки, как вы предложили, или вы можете создать прослушиватель kernel.request
, который запускается после прослушивателя маршрутизатора, и применяет атрибут _controller
, только если ваши условия встретились.
Например, этот routing.yml
:
some_route:
pattern: /xyz
defaults: { _controller_candidate: "FooBundle:Bar:baz" }
И этот слушатель:
class MyListener
{
public function onKernelRequest($event)
{
$request = $event->getRequest();
if (!$controller = $request->attributes->get('_controller_candidiate')) {
return;
}
if (/* your logic... */) {
$request->attributes->set('_controller', $controller');
}
}
}
Настроен для запуска после прослушивателя основного маршрутизатора:
services:
my_listener:
class: MyListener
tags:
-
name: kernel.event_listener
event: kernel.request
priority: -10
Приоритет слушателя основного маршрутизатора 0
в Symfony 2.0 и 32
в Symfony 2.1. В любом случае приоритет -10
должен работать.
Мне интересно узнать, работает ли это:)
Ответ 2
Самое простое решение (и, возможно, я бы предпочел бы) - просто передать класс Request в качестве параметра forward
public function indexAction()
{
$request = $this->getRequest();
return $this->forward('AcmeBundle:Forward:new', array('request' => $request));
}
И в перенаправленном действии просто используйте его как метод param:
public function testAction($request)
{
var_dump($request);exit;
}
Ответ 3
Все параметры POST автоматически перенаправляются. Не требуется никаких действий для установки параметра POST в целевом контроллере.
Но вы должны явно передать параметры запроса (GET) и параметры пути. Метод forward принимает два параметра optionals, представляющие соответственно массивы pathParam и queryParam. Вы можете просто передать весь параметр запроса из текущего запроса
public testAction(Request $request){
$pathParam = array(); //Specified path param if you have some
$queryParam = $request->query->all();
$response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam);
}
Ответ 4
Для меня работает пересылка "атрибутов запроса" как "путь":
public function indexAction()
{
$path = $this->getRequest()->attributes->all();
return $this->forward('CompMyBundle:MyController:MyAction', $path);
}
$path ['_ controller'] будет перезаписан методом forward()!