ZF2在供应商库中使用依赖注入时遇到问题

时间:2013-02-11 01:40:59

标签: php dependency-injection zend-framework2

所以我有以下两难困境。我想拥有一个我所有ZF2应用程序都会使用的公共库。该库将包含我网站的所有业务逻辑。每个应用程序将使用库的不同部分来正确显示/执行所需的任何操作。到目前为止,我已经设法创建了一个库。让我们称之为Foo。 Foo有一个Module.php,它执行加载整个库所需的基本自动加载。

现在我开始遇到问题了。我想利用来自Foo内的ZF2的依赖注入,服务管理器等。问题是我只有一个加载Foo的Module.php。这意味着随着我的库增长,所以Module.php也是如此,因为据我所知,我不能拥有子模块。有没有解决这个问题的方法?

基本上我希望每个应用程序只包含Foo和Foo以包含多个Module.php,以便至少可以逐个模块地处理依赖项内容。

1 个答案:

答案 0 :(得分:0)

你可能正在逆流而去尝试做子模块 - 你可能不需要这样做。

如果您已经很好地编写了模块,加载它将不会是一个非常昂贵的操作。请记住,服务管理器的重点是所有这些服务都是懒惰创建的。因此,如果调用代码从不在特定请求中请求特定服务,那么该服务的类文件永远不会自动加载,该对象永远不会被实例化,等等。因此,您可以使用一个庞大的单片模块。

事情可能会变得有点棘手的一个地方是,如果你非常依赖EventManager,而你的模块正在附加一堆听众。但是你可以通过设置一些模块配置指令来解决这个问题,然后只是有条件地附加监听器。

话虽如此,尝试拆分模块可能是有意义的。所以你可以拥有FooBar和FooBaz模块。

如果你真的,真的,想要子模块,你可以深入了解ModuleManager并尝试解决它。我曾经走过那条路一段路 - 然后分心了。在我的情况下,我正在处理运输实物。我想要一个“Fulfillment”模块,可以配置为加载一堆类似的运输模块(Fulfillment \ Courier \ USPSModule,Fulfillment \ Courier \ FedExModule等),这样我的主要Fulfillment模块就可以迭代所有加载的子模块,而无需特定的关于其中任何一个的知识。如果我没记错的话,最好的方法是基本上反映ZF2的作用,但是在我的Fulfillment \ Module类中。但是,我想不出很多你想要这样做的情况,除非你想要一组类似的子模块都实现相同的接口,并希望它们被没有特定知识的超级模块所使用他们我也看了这个,因为考虑到最终用户运行时启用/禁用这些子模块(有点像插件系统)。

如果你不这样做,我会坚持使用FooBarModule,FooBazModule等,只要它有意义。请记住,即使您的模块包含大量代码,ServiceManager也只会自动加载,解析和实例化满足任何给定请求的依赖关系所需的类。