年 2014年

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

基本的なルートの設定

_welcome:
    path:      /
    defaults:  { _controller: TipsBlogBundle:Main:index }

これは以下と等価。

class MainController extends Controller
{
    /**
     * @Route("/")
     */
    public function indexAction()
    {
    }
}

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

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

これは以下と等価。

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

または

/**
 * @Route("/blog")
 */
class BlogController extends Controller
{
    /**
     * @Route("/{slug}", name="blog_show")
     */
    public function showAction($slug)
    {
    }
}

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

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

これは以下と等価。

/**
 * @Route("/blog/{page}", name="blog", defaults={"page" = 1})
 */
public function indexAction($page)
{
}

ルートの条件

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

これは以下と等価。

/**
 * @Route("/blog/{page}", name="blog", defaults={"page" = 1}, requirements={"page" = "\d+"})
 */
public function indexAction($page)
{
}

別のパターンでは、

homepage:
    path:      /{culture}
    defaults:  { _controller: TipsBlogBundle:Main:index, culture: en }
    requirements:
        culture:  en|ja

これは以下と等価。

/**
 * @Route("/{culture}", name="homepage", requirements={"culture" = "en|ja"})
 */
public function indexAction($culture)
{
}

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

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

contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    methods:  [GET]

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

これはこう書ける。

class MainController extends Controller
{
    /**
     * @Route("/contact")
     * @Method({"GET"})
     */
    public function contactAction()
    {
    }

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