我目前正在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"one_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}参数没有要求。通过使用适当的顺序和巧妙的需求,你可以完成几乎任何事情。