【问题标题】:ZF2 Trouble using dependancy injection in Vendor libraryZF2 在供应商库中使用依赖注入的问题
【发布时间】:2013-02-11 01:40:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: php dependency-injection zend-framework2


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2015-11-21
      • 2016-05-18
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多