2012-07-23 11 views
17

たぶん私は何かが不足しているかもしれませんが、コントローラに渡すことができるように、Symfony2のルートにクエリ文字列パラメータを定義する方法がないようです。例えばSymfony2:urlクエリーストリングパラメータをコントローラに渡すには?

、代わりに(Symfony2ののrouting documentationから)/blog/my-blog-postようなURIを生成し、次の経路にそれを渡す:

# app/config/routing.yml  
blog_show: 
    pattern: /blog/{slug} 
    defaults: { _controller: AcmeBlogBundle:Blog:show } 

Iは/blog?slug=my-blog-postようなURIを生成することを好むだろう。問題は、ルート設定ファイル(上記の{slug}のようなもの)の中でslugパラメータを定義する場所を見つけることができないことです。

おそらくこれは目的に合っていますが、クエリ文字列のGETパラメータを使用するベストプラクティスは何ですか?

ドキュメントには、Generating URLs with Query Stringsに記載されているので、コントローラにそれらを渡す方法はありますか?私はそれらの言及を見つけることができます

Symfony2 and HTTP Fundamentals次のとおりです。

use Symfony\Component\HttpFoundation\Request; 

$request = Request::createFromGlobals(); 

// retrieve GET variables 
$request->query->get('foo'); 

これは、コントローラ内部でそれらを操作するためのベストプラクティスですか?

答えて

44

:として要求オブジェクトを宣言し、symfonyのベースコントローラを拡張しないコントローラの

public function updateAction() 
{ 
    $request = $this->getRequest(); 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 

アクションメソッドのパラメータと、上記のように進む:

public function updateAction(Request $request) 
{ 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 
+12

Symfony 2.4以降、 'getRequest()'メソッドはnoですコントローラメソッドの 'Request'パラメータで2番目のトリックを使うべきです。 symfony 3では 'getRequest()'メソッドが削除されます。 – Brewal

+0

@Brewal: 'Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller'を拡張し、すでにそのルートに定義されているパラメータを取得している'あなたは依然としてリクエストをこのように取得できますか、または単に 'Request :: createFromGlobals()'を使用するだけですか? – fritzmg

+1

'$ request'変数の直前に指定された' Request'タイプのおかげで依然としてリクエストを得ることができます。 Symfonyはそれを推測するのに十分スマートです。 – Brewal

26

ルーティング設定ファイルでクエリ文字列パラメータを指定することはできません。 コントローラー内の$ requestオブジェクトから取得するだけです(nullが存在しない場合は$request->query->get('foo'); となります)。

、与えられたパラメータを指定してルートを生成するために、あなたがそのようなテンプレートを小枝にあなたがそれを行うことができます。

{{ path(route, query|merge({'page': 1})) }} 

あなたのコントローラでルートを生成したい場合は、それだけでマニュアルのようなものだあなたリンク:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony')); 

は(ルートの定義には存在しないパラメータは、クエリ文字列として渡されます)ルート/blog/2?category=Symfonyを生成します。 symfonyの\バンドル\ FrameworkBundle \コントローラ\コントローラを拡張コントローラでGET/POSTパラメータで動作するように

+0

ドキュメント:[生成-URLを-と、クエリ文字列(http://symfony.com/doc/current/routing.html#generating-urls -with-query-strings) – Stphane

関連する問題