排除路由中的路径


Exclude paths in routing

我目前正在Symfony2中使用需求路径来匹配任何URL并适当地处理请求。例如,"example.com/blog/posts/my-new-post"将返回路径blog/posts/my-new-post到控制器,然后我将拆分并检查现有数据等。这工作得很好,问题是路由配置的方式意味着它将始终返回相同的模板文件,即使我设置了额外的路由。

symfony_default_page:
    path:     /{path}
    defaults: { _controller: SymfonyBundle:Default:page }
    requirements:
        path: "^.+"
但是,如果我想在url中调用"forum""admin",它将自动使用上述路由配置。是否有办法排除特定的路径,让适当的路由/控制器处理这些请求?例如:

requirements:
    path: "^ (exclude: "admin/" and "blog/") .+"

所以如果admin, admin/或admin/other-areas是可访问的,它会使用它们的路由配置,如果它们不存在,抛出404。

基本的正则表达式可以解决这个问题:

^(?!admin|login|blog).+

symfony_default_page:
    path:     /{path}
    defaults: { _controller: SymfonyBundle:Default:page }
    requirements:
        path: "^(?!admin|login|blog).+"

但是正如@Santiago00建议的那样,在bundle/config/routing中按正确的顺序放置不同的路由会更容易。或者如果您使用多个包,请更改app/config/routing.yml

中导入包的顺序。

尝试声明"admin"answers";blog"你可以在Symfony Book http://symfony.com/doc/current/book/routing.html#adding-requirements

中了解更多相关信息。

较早的路由总是获胜

这一切意味着路由的顺序是非常重要的。如果将blog_show路由置于blog路由之上,URL/blog/2将匹配blog_show而不是blog,因为blog_show的{slug}参数没有要求。通过使用适当的顺序和巧妙的需求,你可以完成几乎任何事情。