如何在单个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 }
你在用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 }
因此,如果需要,您可以在路径中使用它们。
在这里,您可以看到另一篇如何在路由中使用正则表达式的文章。也许你可以写一个简单的正则表达式,检查是否设置了索引。
编辑:
如果您使用注释(我更喜欢),那么您可以通过控制器的操作方法编写多个路由。像这样:
/**
* @Route("/");
* @Route("/home");
*/
使用
YAML 路由时,还可以使用节点锚点表达式语法来引用现有路由定义。
&
指定锚点的第一次出现,*
指定要引用的锚点,<<
告诉Symfony yaml解析器合并指定的节点。
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不佳,建议改用重定向。
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()
*/
这样我就有一种方法和两条路线。
请记住设置默认值$id:
public function indexAction($id = null)
{
...
}