すべてのGET/POSTパラメータを渡してリクエストを転送することは可能ですか?
私がするだけなら
$this->forward('dest')
GET/POSTパラメータなしでdest
に移動しますか?
[〜#〜] update [〜#〜]
私の目的は、実際には、ユーザーが何かを追加するのに十分な「アイテム」を持っていることを確認するaddSomething
のようなコントローラーアクションを持つことです。次に、リクエストを適切なコントローラーに転送して、adding {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
コアルーターリスナーの優先度は、Symfony2.0では0
、Symfony2.1では32
です。いずれの場合も、優先度-10
が機能するはずです。
これが機能するかどうか知りたいです:)
最も簡単な解決策(そしておそらく私が求める解決策)は、転送パラメーターとして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;
}
すべての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);
}
「リクエスト属性」を「パス」として転送すると、次のように機能します。
public function indexAction()
{
$path = $this->getRequest()->attributes->all();
return $this->forward('CompMyBundle:MyController:MyAction', $path);
}
$ path ['_ controller']はforward()メソッドで上書きされます!