27

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

4 回答 4

31

你在使用 Symfony2 吗?如果您可以并且可以为路由使用注释而不是 yml 或 xml,那么可以沿这些行定义多个路由:

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

那么你就不需要复制动作方法了。

于 2012-07-06T14:10:28.230 回答
27

最简单的方法是复制块并制作 2 条路线。

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

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

因此,如果需要,您可以在路径中同时使用它们。

在这里你可以看到另一篇文章如何在你的路由中使用正则表达式。也许您可以编写一个简单的正则表达式,它检查是否设置了索引

编辑:

如果您使用我更喜欢的注释,那么您可以在控制器的 Action 方法上编写多个路由。像这样的东西:

/**
* @Route("/");
* @Route("/home");
*/
于 2012-07-06T13:45:56.950 回答
16

使用 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
于 2016-11-07T19:26:37.820 回答
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)
{
   ...
}
于 2016-05-25T09:06:34.270 回答