web-dev-qa-db-ja.com

Symfony2:URLクエリ文字列パラメーターをコントローラーに渡す方法

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

たとえば、/blog/my-blog-post(Symfony2の ルーティングドキュメント から)のようなURIを生成して次のルートに渡す代わりに:

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

/blog?slug=my-blog-postのようなURIを生成したいと思います。問題は、ルート構成ファイルでslugパラメーターを定義する場所がどこにも見つからないことです(上記の{slug}のように)。

おそらくこれは意図的なものですが、クエリ文字列でGETパラメーターを操作するためのベストプラクティスは何ですか?

ドキュメントでは クエリ文字列を使用したURLの生成 でそれらについて言及していますが、コントローラーに渡す方法は?

それらの言及を見つけることができる場所は、 Symfony2およびHTTPの基礎 です。

use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();

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

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

19
jcroll

GET/POST Symfony\Bundle\FrameworkBundle\Controller\Controllerを拡張するコントローラーのパラメーターを操作するには:

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

Symfonyベースコントローラーを拡張しないコントローラーの場合、リクエストオブジェクトをアクションメソッドのパラメーターとして宣言し、上記の手順に従います。

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

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

そして、与えられたパラメータでルートを生成するには、あなたの中でそれを行うことができますtwigそのようなテンプレート:

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

コントローラーでルートを生成したい場合、リンクしたドキュメントのようになります:

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

ルートを生成します/blog/2?category=Symfony(ルート定義に存在しないパラメーターは、クエリ文字列として渡されます)。

28
Nanocom