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()!