排除路由中的路径

时间:2014-08-10 14:19:50

标签: php regex symfony routing yaml

我目前正在使用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: "^.+"

但是,如果我想在网址中调用"论坛" " admin" ,它会自动使用上述路由组态。有没有办法排除特定路径并让相应的路由/控制器处理这些请求?

例如:

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

因此,如果admin,admin /或admin / other-areas是访问权限,它将使用他们的路由配置,如果他们没有'存在,抛出404。

2 个答案:

答案 0 :(得分:5)

原来相当基本的正则表达式将解决这个问题:

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

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

但正如@ Santiago00建议的那样,只需在bundle / config / routing.yml中以正确的顺序放置不同的路由,或者如果您使用多个捆绑包,则更改app/config/routing.yml中导入的捆绑包的顺序

答案 1 :(得分:2)

尝试声明" admin"和#34;博客"在默认路由之前的路由,您可以在Symfony Book http://symfony.com/doc/current/book/routing.html#adding-requirements

中阅读更多相关信息
  

早期路线总是胜利

     

这一切意味着路线的顺序非常重要。如果blog_show路由位于博客路径上方,则URL / blog / 2将匹配blog_show而不是blog,因为blog_show的{slug}参数没有要求。通过使用正确的排序和聪明的要求,您几乎可以完成任何事情。