0

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

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

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

4

1 回答 1

0

您可能正在逆流而上尝试做子模块——而且您可能不需要这样做。

如果你已经很好地编写了你的​​模块,加载它不会是一个非常昂贵的操作。请记住,服务管理器的全部意义在于所有这些服务都是延迟创建的。因此,如果调用代码从不要求特定请求中的特定服务,则该服务的类文件永远不会自动加载,对象永远不会实例化,等等。所以你可能会很好地留在一个大的、单片的模块中。

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

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

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

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

于 2013-02-11T23:51:17.987 回答