Symfony2のアノテーション@Route、@Method – ルーティング設定




h2. 基本的なルートの設定
1
2
3
_welcome:
    path
:     /
    defaults
: { _controller: TipsBlogBundle:Main:index }

これは以下と等価。

1
2
3
4
5
6
7
8
9
class MainController extends Controller
{
    /**
     * @Route("/")
     */

    public function indexAction()
    {
    }
}

プレースホルダー付きのルート

1
2
3
blog_show:
    path
:     /blog/{slug}
    defaults
: { _controller: TipsBlogBundle:Blog:show }

これは以下と等価。

1
2
3
4
5
6
7
8
9
class BlogController extends Controller
{
    /**
     * @Route("/blog/{slug}", name="blog_show")
     */

    public function showAction()
    {
    }
}

または

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * @Route("/blog")
 */

class BlogController extends Controller
{
    /**
     * @Route("/{slug}", name="blog_show")
     */

    public function showAction($slug)
    {
    }
}

プレースホルダーの必須/任意設定

1
2
3
blog:
    path
:     /blog/{page}
    defaults
: { _controller: TipsBlogBundle:Blog:index, page: 1 }

これは以下と等価。

1
2
3
4
5
6
    /**
     * @Route("/blog/{page}", name="blog", defaults={"page" = 1})
     */

    public function indexAction($page)
    {
    }

ルートの条件

1
2
3
4
5
blog:
    path
:     /blog/{page}
    defaults
: { _controller: TipsBlogBundle:Blog:index, page: 1 }
    requirements
:
        page
: \d+

これは以下と等価。

1
2
3
4
5
6
    /**
     * @Route("/blog/{page}", name="blog", defaults={"page" = 1}, requirements={"page" = "\d+"})
     */

    public function indexAction($page)
    {
    }

別のパターンでは、

1
2
3
4
5
homepage:
    path
:     /{culture}
    defaults
: { _controller: TipsBlogBundle:Main:index, culture: en }
    requirements
:
        culture
: en|ja

これは以下と等価。

1
2
3
4
5
6
    /**
     * @Route("/{culture}", name="homepage", requirements={"culture" = "en|ja"})
     */

    public function indexAction($culture)
    {
    }

HTTP メソッド の制約をつける

同一のURLでもHTTPメソッドによって呼び出すメソッドやコントローラを使い分けることが可能。

1
2
3
4
5
6
7
8
9
contact:
    path
:    /contact
    defaults
: { _controller: AcmeDemoBundle:Main:contact }
    methods
: [GET]

contact_process
:
    path
:    /contact
    defaults
: { _controller: AcmeDemoBundle:Main:contactProcess }
    methods
: [POST]

これはこう書ける。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MainController extends Controller
{
    /**
     * @Route("/contact")
     * @Method({"GET"})
     */

    public function contactAction()
    {
    }

    /**
     * @Route("/contact")
     * @Method({"POST"})
     */

    public function contactProcessAction()
    {
    }
}

関連記事

Leave a Reply

アーカイブ