2012-07-06 110 views
1

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

路由器还要考虑到域名。

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

+0

可能重复http://stackoverflow.com/questions/8384660/custom-route-class) – 2012-07-06 17:17:06

+0

@Peter Bailey:我已经读过这个问题,我甚至提供过并且奖励了它。这个问题更具体,因为我不是只根据请求URI进行路由,而是根据域名进行路由。 – Benjamin 2012-07-07 23:06:07

+0

好吧,有一些bundle基于域进行路由,但它也被放到了Symfony 2.2的核心中https://github.com/symfony/symfony/pull/3378。此外,另一个答案就可能适合http://stackoverflow.com/questions/5366234/symfony2-routing-route-subdomains – 2012-07-10 14:32:07

回答

4

为了达到你的要求奏鸣曲管理包,你并不需要完全重新定义了路由器

你可以简单地写自己的类,它实现UrlMatcherInterface。如果您希望能够生成与您的方案相匹配的URL,则必须创建另一个类别,以覆盖UrlGeneratorInterface

为了考虑域名,你需要使用RequestContext,它被传递给它们的构造函数(没有很好的文档记录,但是检查Router ::获得{Matcher,Generator}的细节)。

一旦你的类准备好了,你可以通过重写你的包中的参数“router.options.generator_class”和“router.options.matcher_class”来将它们注入到路由器中。


然而,它可能不是你想要的东西,最好的方法 - 覆盖路由器的部分一样,需要大量的护理,以保持所有的缓存。

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

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

+0

如何扩展Symfony路由的UrlMatcher,并注入?这样,您可以保留原始路由逻辑,并在必要时注入自己的路由逻辑。我还没有测试过,但我想这样做来检查特定路由的浏览器类型,因此它们可用于特定(例如移动)浏览器。 – GergelyPolonkai 2012-08-07 19:13:21

+0

这正是我在回答的第一部分所建议的内容(router.options.matcher_class参数是您用来注入自定义UrlMatcher的参数)。但请记住,如果您希望生成的URL正常工作,则还必须覆盖UrlGenerator。 – 2012-08-08 00:56:26

0

是指由具有自定义路由class

1

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

前和使用CrudLoader在这里可以看到在routing/crud/acompetencies.yml

后,这仅仅是一个解决办法或资源,你可以在这个CrudLoader类看的滥用。

我不知道这是对还是不好的做法。它似乎运作良好。

0

symfony的2.5需要参数定制匹配:router.options.matcher_base_class 和其实现的Symfony \元器件\路由\匹配器\ RequestMatcherInterface类

[自定义路由类(的