4

レガシー アプリケーションを Symfony2 に移植していますが、ルーティングにクエリ文字列パラメーターが含まれていないため苦労しています。いくつかの簡単な例: 基準に基づいて結果をフィルタリングできる書籍の検索ページがあるとします。

http://www.bookstore.com/books?author=Stephen+King&maxPrice=20

このような場合のクエリ文字列パラメーターの利点は、任意の数のフィルターを使用でき、特定の要求に必要なフィルターを使用でき、使用していないフィルターで URL を混雑させないことです。

Symfony2 ルーティング コンポーネントを使用して、上記のクエリのルーティングを書き直したとしましょう。次のようになります。

http://www.mybookstore.com/book/any_title/stephen%20king/any_release_date/max_price_20/any_min_price/any_format/any_category

そのルートの各「セグメント」はキーと値のペアではなく、単なる値 (例: author=Stephen+King> /stephen%20king/) であるため、その URL がどれだけ長いかを考慮しなくても、それほど直感的ではないと思います。

もちろん、リクエスト オブジェクトをアクション メソッドに渡すことで、コントローラーのクエリ文字列パラメーターにアクセスできますが (例: indexAction(Request $request) {)、それらを検証して、アプリケーションの他の部分 (つまり、現在自分がいる場所) に渡すのは面倒です。.currentKnp Menu Bundle を使用してサイドバーを作成していて、クエリ文字列パラメーターに基づいてパーツをマークしたい場合はどうすればよいでしょうか? そのための機能はなく、Symfony2 ルートと統合するための機能のみです。

また、クエリ文字列パラメーターが受け入れられることを検証する方法は? 私は現在、それらをフォームのように検証してから、データベースに渡してクエリを生成することを検討しています。たぶん、これは Symfony2 チームがそれらを処理することを想定した方法でしょうか? もしそうなら、私は本当に理由を知りたいです。アプリケーションと戦っているような気がします。

4

2 に答える 2

2

私は実際に Symfony Live San Francisco 2012 で Fabien にこの質問をすることになりました. この質問に関して同じ会議で別の講演がありました. ここでスライドを共有します:

http://www.slideshare.net/Wombert/phpjp-urls-rest#btn次へ

基本的に、スライドでは、クエリ文字列パラメーターをフィルタリングに使用する必要があるという点で、著者が私に同意していることがわかります。それらを使用してはならないのは、コンテンツ ソースの決定です。したがって、ルートは製品 (または何でも) を指す必要があり、クエリ文字列パラメーターをコントローラーで使用して、そのコンテンツ ソースをフィルター処理するために必要なロジックを適用する必要があります (Fabien に従って)。

フォームが処理されるのとほぼ同じ方法で、すべてのクエリ文字列パラメーターをバインドして操作するエンティティをアプリケーションで作成することになりました。実際、よく考えてみると、基本的には同じことです。

于 2012-11-26T20:13:33.693 に答える
0

Symfony1 と同様に、クエリ文字列はルート パラメーターから独立しています。

として定義されたパスがある場合@Route("/page/{id}", name="single_page")、次のようにビューにパスを作成できます。

{{ path('single_page', { id: 3, foo: "bar" }) }}

結果の URL は/page/3?foo=bar.

于 2012-09-20T18:56:13.973 に答える