如何在单个Symfony路由中创建多个模式?
通常我们有路由
blog:
pattern: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
是否可以有两种路由模式?
像
这样的东西blog:
#Below pattern to match with '/' or '/index'
pattern: {/ , /index}
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
答案 0 :(得分:24)
最简单的方法是复制块并制作2条路线。
blog:
pattern: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
blog_index:
pattern: /index
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
因此,如果需要,您可以在路径中使用它们。
Here您可以在路由中看到另一篇文章如何使用正则表达式。也许你可以写一个简单的正则表达式,它检查是否设置了索引。
修改强>
如果您使用我更喜欢的注释,那么您可以通过Controller的Action方法编写多个路径。像这样:
/**
* @Route("/");
* @Route("/home");
*/
答案 1 :(得分:24)
您使用的是Symfony2吗?如果你是,并且可以使用注释代替yml或xml,那么可以在这些行中定义多个路由:
/**
* @Route("/");
* @Route("/home");
*/
然后您不需要复制操作方法。
答案 2 :(得分:14)
使用YAML路由时,您还可以使用node anchors表达式语法来引用现有路由定义。
&
指定第一次出现锚点,*
指定要引用的锚点,<<
告诉Symfony yaml parser合并指定的节点。
blog: &blog
path: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
blog_index:
<<: *blog
path: /index
blog_page:
<<: *blog
path: /blog
或者,您可以在route attribute value上使用锚点。
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
但是,为防止因重复内容导致搜索引擎优化不佳,建议改用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
答案 3 :(得分:1)
只是加入约翰的回答:
我在FOSJsRoutingBundle中使用了很多:
/**
* @Route("/", name="route_name_1", options={"expose"=true})
* @Route("/{id}", name="route_name_2", options={"expose"=true})
* @Method("GET")
* @Template()
*/
这样我有一个方法和两个路径。
请记住设置默认的$ id值:
public function indexAction($id = null)
{
...
}