web-dev-qa-db-ja.com

単一のsymfonyルーティングでの複数のパターン

単一のSymfonyルーティングで複数のパターンを作成するにはどうすればよいですか?

通常、ルーティングは

blog:
    pattern:   /
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }

2つのルーティングパターンを使用することは可能ですか?

何かのようなもの

blog:
    #Below pattern to match with '/' or '/index'    
    pattern:   {/ , /index}  
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }
22
Justin John

Symfony2を使用していますか? ymlまたはxmlの代わりにルーティングにアノテーションを使用できる場合は、これらの行に沿って複数のルートを定義することが可能です。

/**
* @Route("/");
* @Route("/home");
*/

その後、アクションメソッドを複製する必要はありません。

28
john

最も簡単な方法は、ブロックを複製して2つのルートを作成することです。

blog:
    pattern:   /
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }

blog_index:
    pattern:   /index
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }

したがって、必要に応じて、パスで両方を使用する可能性があります。

ここ ルーティングで正規表現を使用する方法の別の投稿を見ることができます。おそらく、indexが設定されているかどうかをチェックする単純な正規表現を書くことができます。

編集:

私が好むアノテーションを使用する場合は、コントローラーのアクションメソッドを介して複数のルートを記述できます。このようなもの:

/**
* @Route("/");
* @Route("/home");
*/
25
René Höhle

YAMLルートを使用する場合、 ノードアンカー 式構文を使用して既存のルート定義を参照することもできます。

&は、アンカーの最初の出現を指定します*は参照するアンカーを指定し、<<Symfony yaml parser に指定されたノードをマージするように伝えます。

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

blog_index:
  <<: *blog
  path: /index

blog_page:
  <<: *blog
  path: /blog

あるいは、 ルート属性値 でアンカーを使用できます。

blog:
  path: /
  defaults: &blog_defaults
    _controller: AcmeBlogBundle:Blog:index
    page: 1

blog_index:
  path: /index
  defaults: *blog_defaults

blog_page:
  path: /blog
  defaults: *blog_defaults

ただし、コンテンツの重複によるSEOの低下を防ぐために、代わりに redirect を使用することをお勧めします。

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

blog_index:
  path: /index
  defaults: &blog_redirect
    _controller: FrameworkBundle:Redirect:redirect
    route: blog
    permanent: true

blog_page:
  path: /blog
  defaults: *blog_redirect
15
fyrye

ジョンの答えに追加するだけです:

FOSJsRoutingBundleでよく使用します。

/**
 * @Route("/", name="route_name_1", options={"expose"=true})
 * @Route("/{id}", name="route_name_2", options={"expose"=true})
 * @Method("GET")
 * @Template()
 */

この方法には、1つのメソッドと2つのルートがあります。

デフォルトの$ id値を設定することを忘れないでください:

public function indexAction($id = null)
{
   ...
}
1
Strabek