单一symfony路由中的多种模式

vxf3dgd4  于 2023-10-24  发布在  其他
关注(0)|答案(5)|浏览(107)

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

af7jpaap1#

你在用Symfony 2吗?如果你可以使用annotation来代替yml或xml,那么你可以沿着这些行定义多个路由:

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

那么你就不需要重复这个操作方法了。

jutyujz0

jutyujz02#

最简单的方法是复制块,使2路线。

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

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

所以如果你需要的话,你可以在你的道路上使用这两种方法。
Here你可以看另一篇关于如何在路由中使用正则表达式的文章。也许你可以写一个简单的正则表达式,检查是否设置了index

编辑:

如果你使用annotation(我更喜欢),那么你可以在Controller的Action方法上编写多个路由。类似于这样:

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

xoefb8l83#

使用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,建议使用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
jmp7cifd

jmp7cifd4#

再加上约翰的回答:
我经常使用FOSJsoftingBundle:

/**
 * @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)
{
   ...
}
dsekswqp

dsekswqp5#

自Symfony 5.2使用属性:

#[
    Route('/', 'app_home'),
    Route('/home', 'app_home_alt')
]

相关问题