カスタマイズ編(1) ルーティングのURLパラメータの必須条件の指定

Note

この記事は、Symfony 2.0.7 で動作確認しています。

ルーティングのURLパラメータの受け入れられる値

現在のblogアプリケーションには、以下のURLのパターンが存在します。

  • /blog/
  • /blog/new
  • /blog/{id}/show
  • /blog/{id}/delete
  • /blog/{id}/edit

{id} には、データベースの Post テーブルのプライマリキー、すなわち整数値を期待しています。 しかしながら、{id} に適当な文字列を入力しても有効なURLとして受け入れられてしまっています。 例えば /blog/hoge/show/blog/foo/edit などのURLは有効とみなされてしまい、アクションが実行されてしまいます。 {id} には整数値しか受け入れないように制限する方が望ましいです。

別の例として以下のようなURLパターンを想定してみます。

  • /blog/{id}/show
  • /blog/{slug}/show

{id} には、やはり Post テーブルのプライマリキー、すなわち整数値を期待しています。 一方 {slug} には、整数値以外のすべての文字列を期待しています。 しかしながら、{id} はあらゆる文字列を受け入れてしまうため、/blog/{slug}/show は実行されません。 やはりこの場合も、{id} には整数値しか受け入れないように制限する必要があります。

URLパラメータに必須条件を指定する

routing.yml の設定で、URLパラメータに対する必須条件を正規表現で指定することができます。 blogアプリケーションの routing.yml を修正して、{id} に整数値以外が入らないようにします。

# src/My/BlogBundle/Resources/config/routing.yml
blog_index:
    pattern:  /
    defaults: { _controller: MyBlogBundle:Default:index }

blog_new:
    pattern:  /new
    defaults: { _controller: MyBlogBundle:Default:new }

blog_show:
    pattern:  /{id}/show
    defaults: { _controller: MyBlogBundle:Default:show }
    requirements:
        id:  \d+

blog_delete:
    pattern:  /{id}/delete
    defaults: { _controller: MyBlogBundle:Default:delete }
    requirements:
        id:  \d+

blog_edit:
    pattern:  /{id}/edit
    defaults: { _controller: MyBlogBundle:Default:edit }
    requirements:
        id:  \d+

このように修正することで、{id} に整数値以外が入った場合はマッチするURLが存在しないので、 どのアクションも実行されずに 404 エラーが発生するようになります。

もっとルーティングについて知りたい場合は、ガイドブックのルーティングを参照してください。