Передача запроса Symfony 2 по параметрам GET / POST - PullRequest
11 голосов
/ 03 января 2012

Можно ли переслать запрос, передавая все параметры GET / POST?

Я думаю, что если я просто сделаю

$this->forward('dest')

Я пойду на dest без каких-либо параметров GET / POST?

ОБНОВЛЕНИЕ

Моя цель на самом деле состоит в том, чтобы иметь действие контроллера, подобное addSomething, которое проверяет, что у пользователя достаточно «элементов», чтобы что-то добавить.Затем перенаправьте запрос соответствующему контроллеру для продолжения фактического добавления добавления {Type} Something

Или будет ли во всех контроллерах получать услугу «проверки», которая делает проверку более подходящей?В любом случае, я думаю, что полезно знать, как перенаправить действие контроллера со всеми параметрами

Ответы [ 4 ]

28 голосов
/ 03 января 2012

Самое простое решение (и, вероятно, я бы выбрал), это просто передать класс Request в качестве параметра пересылки

public function indexAction()
{
    $request = $this->getRequest();

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request));
}

И в перенаправленном действии просто использовать его как параметр метода:

public function testAction($request)
{
    var_dump($request);exit;
}
15 голосов
/ 03 января 2012

Я не вижу здесь никакой причины пересылать запрос обратно через ядро. Вы можете пойти по пути инкапсуляции этой логики в службе проверки, как вы предлагали, или вы можете создать 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 должен работать.

Мне любопытно посмотреть, сработает ли это:)

12 голосов
/ 13 октября 2015

Все параметры POST автоматически передаются.Никаких действий не требуется, чтобы параметр POST находился в целевом контроллере.Но вы должны явно передать параметры запроса (GET) и параметры пути.Метод forward принимает 2 дополнительных параметра, представляющих соответственно массивы 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);
}
1 голос
/ 24 октября 2013

Пересылка «атрибутов запроса», так как «путь» работает для меня:

public function indexAction()
{
    $path = $this->getRequest()->attributes->all();
    return $this->forward('CompMyBundle:MyController:MyAction', $path);
}

$ path ['_ controller'] будет перезаписан в методе forward ()!

...