单个symfony路由中的多个模式

时间:2012-07-06 13:27:22

标签: php symfony routing

如何在单个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 }

4 个答案:

答案 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)
{
   ...
}