Symfony2でデフォルトのルーティングを設定するにはどうすればよいですか?
Symfony1では、次のようになりました。
homepage:
url: /
param: { module: default, action: index }
default_symfony:
url: /symfony/:action/...
param: { module: default }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/...
私はこれに対する答えをクックブックで探していましたが、見つけたと思います ここ 。デフォルトでは、すべてのルートパラメータには、任意の文字と一致するという非表示の要件がありますexcept /文字([^ /] +)ですが、この動作は、強制的に一致させることにより、requirementsキーワードで上書きできます。 any文字。
以下は、他のすべてをキャッチするデフォルトルートを作成する必要があります-したがって、後続のルートはすべて一致するため、ルーティング構成の最後に来る必要がありますnever。 「/」にも一致するように、urlパラメーターのデフォルト値が含まれています。
default_route:
pattern: /{url}
defaults: { _controller: AcmeBundle:Default:index, url: "index" }
requirements:
url: ".+"
標準のルーティングコンポーネントでは不可能だと思います。このバンドルを見てください、それは役立つかもしれません: https://github.com/hidenorigoto/DefaultRouteBundle
// Symfony2 PR10
routing.yml内:
default:
pattern: /{_controller}
これにより、次の種類のURLを使用できるようになります。 http:// localhost/MySuperBundle:MyController:myview
Symfony2標準ルーティングコンポーネントはそれをサポートしていませんが、このバンドルはSymfony1が残したギャップを埋めます。
https://github.com/LeaseWeb/LswDefaultRoutingBundle
それはあなたが期待することをします。次の構文を使用して、デフォルトでバンドルをルーティングできます。
FosUserBundle:
resource: "@FosUserBundle"
prefix: /
type: default
バンドルをスキャンし、以下を実行してデバッグできるルートをルーターテーブルに自動的に追加します。
app/console router:debug
自動的に追加されたデフォルトルートの例:
[router] Current routes
Name Method Pattern
fos_user.user.login_check ANY /user/login_check.{_format}
fos_user.user.logout ANY /user/logout.{_format}
fos_user.user.login ANY /user/login.{_format}
...
ファイル拡張子(html、json、またはxml)を使用した自動「フォーマット」選択もサポートしていることがわかります。
次に例を示します。 http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing
ルート定義には、必須パラメーターpattern
が1つと、オプションパラメーターdefaults
、requirements
、およびoptions
が3つだけあります。
これが私自身のプロジェクトからのルートです:
video:
pattern: /watch/{id}/{slug}
defaults: { _controller: SiteBundle:Video:watch }
requirements: { id: "\d+", slug: "[\w-]+"
または、コントローラーファイルで@Routeアノテーションを直接使用することもできます。 https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst を参照してください
デフォルトルートに関しては、Symfony2は明示的なルートマッピングを推奨していると思います。
デフォルトルートを作成することは、プログラミングの良い方法ではありません。どうして?このため、例外が実装されました。 Symfony2は、正しいことを正しい方法で行うためだけに構築されています。
すべての「見つからない」ルートをリダイレクトする場合は、NotFound404などの例外を使用する必要があります。このページを自分でカスタマイズすることもできます。
1つのルートは1つの目的のためです。常に。他の人は悪いと思います。
すべてのリクエストを処理し、URLパラメータを使用して、コントローラのforwardメソッドに渡す文字列を作成する独自のバンドルを作成できます。しかし、それはかなりくだらないです、私は明確に定義されたルートを使います、それはあなたのURLをきれいに保ち、そしてURLとコントローラー名を切り離します。バンドルなどの名前を変更した場合、URLをリファクタリングする必要がありますか?
「すべてをキャッチ」を作成する場合、最善の策はKernelEvents::EXCEPTION
イベントをフックすることです。このイベントは、例外がHttpKernel
にフォールスルーするたびにトリガーされます。これには、ルーターがコントローラーへのルートを解決できない場合にスローされるNotFoundHttpException
が含まれます。
効果は、app_dev.phpを介してリクエストを送信したときにレンダリングされるSymfonyの定型化された404ページに似ています。 404を返す代わりに、探しているロジックを実行します。
それは異なります...私のいくつかはこのように見えます:
api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /
いくつかは次のように見えます
api_images:
path: /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods: [GET]
requirements:
fileName: .+