単一の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 }
Symfony2を使用していますか? ymlまたはxmlの代わりにルーティングにアノテーションを使用できる場合は、これらの行に沿って複数のルートを定義することが可能です。
/**
* @Route("/");
* @Route("/home");
*/
その後、アクションメソッドを複製する必要はありません。
最も簡単な方法は、ブロックを複製して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");
*/
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
ジョンの答えに追加するだけです:
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)
{
...
}