web-dev-qa-db-ja.com

Symfony2でのルーティング

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/...
25
umpirsky

私はこれに対する答えをクックブックで探していましたが、見つけたと思います ここ 。デフォルトでは、すべてのルートパラメータには、任意の文字と一致するという非表示の要件がありますexcept /文字([^ /] +)ですが、この動作は、強制的に一致させることにより、requirementsキーワードで上書きできます。 any文字。

以下は、他のすべてをキャッチするデフォルトルートを作成する必要があります-したがって、後続のルートはすべて一致するため、ルーティング構成の最後に来る必要がありますnever。 「/」にも一致するように、urlパラメーターのデフォルト値が含まれています。

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"
28
Longsight

標準のルーティングコンポーネントでは不可能だと思います。このバンドルを見てください、それは役立つかもしれません: https://github.com/hidenorigoto/DefaultRouteBundle

8
dxb

// Symfony2 PR10

routing.yml内:

default:
    pattern:  /{_controller}

これにより、次の種類のURLを使用できるようになります。 http:// localhost/MySuperBundle:MyController:myview

8
Denis Gorbachev

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)を使用した自動「フォーマット」選択もサポートしていることがわかります。

4
mevdschee

次に例を示します。 http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

ルート定義には、必須パラメーターpatternが1つと、オプションパラメーターdefaultsrequirements、およびoptionsが3つだけあります。

これが私自身のプロジェクトからのルートです:

video:
    pattern:  /watch/{id}/{slug}
    defaults: { _controller: SiteBundle:Video:watch }
    requirements: { id: "\d+", slug: "[\w-]+" 
3
Crozin

または、コントローラーファイルで@Routeアノテーションを直接使用することもできます。 https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst を参照してください

デフォルトルートに関しては、Symfony2は明示的なルートマッピングを推奨していると思います。

2
ken

デフォルトルートを作成することは、プログラミングの良い方法ではありません。どうして?このため、例外が実装されました。 Symfony2は、正しいことを正しい方法で行うためだけに構築されています。

すべての「見つからない」ルートをリダイレクトする場合は、NotFound404などの例外を使用する必要があります。このページを自分でカスタマイズすることもできます。

1つのルートは1つの目的のためです。常に。他の人は悪いと思います。

2

すべてのリクエストを処理し、URLパラメータを使用して、コントローラのforwardメソッドに渡す文字列を作成する独自のバンドルを作成できます。しかし、それはかなりくだらないです、私は明確に定義されたルートを使います、それはあなたのURLをきれいに保ち、そしてURLとコントローラー名を切り離します。バンドルなどの名前を変更した場合、URLをリファクタリングする必要がありますか?

1
MFoster

「すべてをキャッチ」を作成する場合、最善の策はKernelEvents::EXCEPTIONイベントをフックすることです。このイベントは、例外がHttpKernelにフォールスルーするたびにトリガーされます。これには、ルーターがコントローラーへのルートを解決できない場合にスローされるNotFoundHttpExceptionが含まれます。

効果は、app_dev.phpを介してリクエストを送信したときにレンダリングされるSymfonyの定型化された404ページに似ています。 404を返す代わりに、探しているロジックを実行します。

1
D H

それは異なります...私のいくつかはこのように見えます:

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: .+
0
luminol