1

我有一个关于在 Zend 2 中构建自定义路由器的最佳实践问题。我想使用服务管理器在我的路由器中获取一些东西,这将允许我连接到任意数据源(而不向我的路由器公开任何信息)这样我就可以确定我是否可以匹配该路线。

例如,我会在我的match()方法中做这样的事情:

$serviceManager->get('site_manager')->locateByRequest($request);

但是,没有明确的方法可以访问路由器中的服务定位器。我发现这篇文章本质上创建了一个自定义工厂,以便您将服务定位器注入您的路由器: http ://www.zendexperts.com/2012/12/09/custom-routing-in-zend-framework-2/

这是最好的方法吗?还有其他想法或建议吗?

这里的主要事情是不允许我的路由器知道关于我所谓的site_manager可能使用 JSON 文本文件或 MongoDB 后端或其他任何东西的实现的任何信息。我不想要任何依赖,我只想公开上面代码示例中的方法调用。

想法、意见、建议?

4

1 回答 1

0

我认为注入整个服务管理器太过分了。我认为可以将其注入控制器或其他可能需要访问许多服务的助手中,但是对于具有定义的责任和与路由器一样窄的助手组件,我更愿意:

  • 创建一个接口,该接口定义路由器将使用的类应该具有什么行为。
  • 只注入路由器需要的服务,可以是实现该接口的任何类。

有了这个,您可以更改路由器如何解析路由的行为,更改您用来执行此操作的服务,但无需更改路由器代码即可访问不应超过配置问题的内容。有了这个,您将获得更好的解耦并拥有更纯粹的依赖注入。

看看这篇关于服务定位器、依赖注入及其区别的文章

此外,看看Strategy Pattern也会很有趣。这或多或少是我所说的。与其赋予路由器知识和决策能力,它只是期望注入一个依赖项,并且在该依赖项内部是路由器需要的某些进程的实现,但是实现相同结果的策略可能不同,并且路由器并不真正关心正在使用哪一个。

于 2014-01-29T11:05:10.140 回答