Можно ли отправить запрос, пройдя все параметры GET / POST?
Я думаю, если я просто сделаю
$this->forward('dest')
Я поеду в dest
без каких-либо параметров GET / POST?
ОБНОВИТЬ
Моя цель состоит в том, чтобы иметь действие контроллера, такое как addSomething
которое принимает проверки, что у пользователя есть достаточные «элементы», чтобы что-то добавить. Затем переадресуйте запрос на контроллер-ассистент, чтобы продолжить фактическое добавление добавления {Type} Something
Или вы получите «проверку» службы во всех контроллерах, что делает проверку более подходящей? В любом случае, я думаю, что он информативен, чтобы знать, как перенаправить действие контроллера со всеми параметрами
Я не вижу здесь никакой причины пересылать запрос обратно через ядро. Вы можете пойти по пути инкапсуляции этой логики в службу проверки, как вы предложили, или вы можете создать слушатель 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
должен работать.
Мне интересно узнать, работает ли это 🙂
Самое простое решение (и, возможно, я бы предпочел бы) – просто передать класс 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; }
Все параметры 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); }
Для меня работает пересылка «атрибутов запроса» как «путь»:
public function indexAction() { $path = $this->getRequest()->attributes->all(); return $this->forward('CompMyBundle:MyController:MyAction', $path); }
$ path ['_ controller'] будет перезаписан в методе forward ()!