web-dev-qa-db-ja.com

GET / POSTパラメーターを渡すSymfony2転送リクエスト

すべてのGET/POSTパラメータを渡してリクエストを転送することは可能ですか?

私がするだけなら

$this->forward('dest')

GET/POSTパラメータなしでdestに移動しますか?

[〜#〜] update [〜#〜]

私の目的は、実際には、ユーザーが何かを追加するのに十分な「アイテム」を持っていることを確認するaddSomethingのようなコントローラーアクションを持つことです。次に、リクエストを適切なコントローラーに転送して、adding {Type} Somethingの実際の追加を続行します

または、チェックがより適切であるすべてのコントローラーで「チェック」サービスを取得しますか?とにかく、すべてのパラメーターを使用してコントローラーアクションに転送する方法を知っていることは有益だと思います

11
Jiew Meng

カーネルを介してリクエストを転送する理由はここにはありません。提案したように、このロジックをチェッカーサービスにカプセル化するルートをたどることができます。または、ルーターリスナーの後に実行され、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

コアルーターリスナーの優先度は、Symfony2.0では0、Symfony2.1では32です。いずれの場合も、優先度-10が機能するはずです。

これが機能するかどうか知りたいです:)

15
Kris Wallsmith

最も簡単な解決策(そしておそらく私が求める解決策)は、転送パラメーターとしてRequestクラスを渡すことです。

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

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

転送されたアクションでは、メソッドparamとして使用します。

public function testAction($request)
{
    var_dump($request);exit;
}
28
Inoryy

すべてのPOST paramは自動的に転送されます。ターゲットコントローラにPOST paramを含めるためのアクションは必要ありません。ただし、クエリ(GET)パラメータとを明示的に渡す必要があります。 pathparams。forwardメソッドは、pathParam配列とqueryParam配列をそれぞれ表す2つのオプションパラメーターを取ります。現在のリクエストからすべてのクエリパラメーターを渡すことができます。

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);
}
12
Genoud Magloire

「リクエスト属性」を「パス」として転送すると、次のように機能します。

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

$ path ['_ controller']はforward()メソッドで上書きされます!

1
Dado