我有一些相当复杂的路由规则,只能通过自定义代码实现,而不是默认路由器。
路由器还必须考虑域名。
是否有可能(以及如何)定义我自己的路由器类,它有一个接受 aRequest
并返回包/控制器名称的方法?
要实现您的要求,您无需完全重新定义路由器
您可以简单地编写自己的实现UrlMatcherInterface的类。如果您还希望能够生成与您的方案匹配的 URL,则必须创建另一个覆盖UrlGeneratorInterface的类。
为了考虑域名,您需要使用 RequestContext,它被传递给它们的构造函数(它没有很好的文档记录,但请查看Router ::get{Matcher,Generator} 了解详细信息)。
一旦你的类准备好了,你可以简单地通过覆盖你的包中的参数“router.options.generator_class”和“router.options.matcher_class”将它们注入到路由器中。
但是,它可能不是您想要的最佳方法 - 像这样覆盖路由器的部分需要非常小心才能保留所有缓存。
您可能要考虑使用 Symfony2 的普通路由器,但根据请求的域是不同的路由文件。如果您将 Web 服务器配置为设置变量或根据域名执行不同的前端控制器,则可以轻松完成此操作。
使用该信息,您可以为每个请求加载不同的“环境”,不同环境之间的唯一区别是它们使用不同的路由文件。
在学习了 Matthias Noback 的教程之后,我对我的 CRUD 路由构建器做了一些修改。
在routing/crud/acompetencies.yml中可以看到使用 CrudLoader 之前和之后
正如您在这个CrudLoader类中看到的那样,这只是一种解决方法或资源滥用。
我不知道这是正确的做法还是坏的做法。它似乎运作良好。
参考具有自定义路由类类的奏鸣曲管理包
symfony 2.5 需要自定义匹配器的参数:router.options.matcher_base_class 和实现 Symfony\Component\Routing\Matcher\RequestMatcherInterface 的类