使用Symfony 2进行自定义路由

时间:2012-07-06 15:04:06

标签: php symfony

我有一些相当复杂的路由规则,这些规则只能通过自定义代码实现,而不能使用默认路由器。

路由器还必须考虑域名。

是否有可能(以及如何)定义我自己的Router类,它会有一个方法接受Request并返回包/控制器名称?

4 个答案:

答案 0 :(得分:4)

要实现您的要求,您无需完全重新定义路由器

您可以编写自己的实现UrlMatcherInterface的类。如果您希望能够生成与您的方案匹配的网址,则还必须创建另一个覆盖UrlGeneratorInterface的类。

为了考虑域名,你需要使用RequestContext,它被传递给它们的构造函数(它没有很好地记录,但请检查Router :: get {Matcher,Generator}详情)。

准备完课程后,只需覆盖捆绑包中的“router.options.generator_class”和“router.options.matcher_class”参数即可将它们注入路由器。


然而,它可能不是您想要的最佳方法 - 覆盖路由器的部分需要非常小心以保留所有缓存。

您可能需要考虑使用Symfony2的普通路由器,但根据请求的域名将其交给不同的路由文件。如果您将Web服务器配置为根据域名设置变量或执行不同的前端控制器,则可以轻松完成此操作。

使用该信息,您可以为每个请求加载不同的“环境”,不同环境之间的唯一区别是它们使用不同的路由文件。

答案 1 :(得分:1)

在研究了Matthias Noback的教程之后,我对我的CRUD路由构建器做了一些修改。

使用CrudLoader之前和之后可以在routing/crud/acompetencies.yml

中看到

这只是一种解决方法或滥用资源,您可以在此CrudLoader课程中看到。

我不知道这是不是正确或不好的做法。它似乎运作良好。

答案 2 :(得分:0)

引用具有自定义路由class

的sonata管理包

答案 3 :(得分:0)

symfony 2.5需要自定义匹配器的参数:router.options.matcher_base_class 和实现Symfony \ Component \ Routing \ Matcher \ RequestMatcherInterface

的类