0

我有一些关于我的应用程序从 zf2 迁移到 zf3 的问题。我已经阅读了迁移指南并按照那里的描述开始了迁移过程。

根据迁移指南,控制器中不再有 serviceLocator 可用。我曾经在每个控制器操作中使用它来将配置变量数组(位于 module.config.php 中)、Doctrine MongoDB DocumentManagerDoctrine EntityManager注入到需要它们的模型中。现在我收到了很多已弃用的警告消息,如下所示;

PHP 已弃用:Zend\ServiceManager\ServiceManager::getServiceLocator 的使用自 v3.0.0 起已弃用;请在第 169 行的 /var/www/html/LeapX/vendor/zendframework/zend-servicemanager/src/ServiceManager.php 中使用传递给工厂的容器

因为我需要访问配置变量并将Doctrine DocumentManagerDoctrine EntityManager注入到我的模型中,所以我必须$this->getServiceLocator()在我的控制器中调用。让我知道如何解决这个问题。有没有可能将这些依赖项直接注入我的模型类?我是否需要为模型使用工厂?

另一个问题是关于控制器的工厂,我是否需要为我的应用程序的每个控制器创建单独的工厂?在应用程序的几个模块中分布着相当多的控制器。如果我为每个控制器添加专用工厂,则数量将增加一倍。让我知道执行此操作的最佳方法。

4

1 回答 1

2

从我自己阅读的内容来看,不再可能从控制器调用 getServiceLocator(),他们将其删除,因为它促进了反模式。

这是 Matthew 本人关于此问题的博客文章: https ://mwop.net/blog/2016-04-26-on-locators.html

这个人自己的另一个解释(更短,可能更容易消化): https ://github.com/zendframework/zend-mvc/issues/89

我目前也在尝试将 ZF2 (2.4.10) 项目迁移到 ZF3 并面临同样的问题。

我个人同意明确定义类和控制器的依赖关系而不是(过度)使用 getServiceLocator() 方法的建议,尽管根据您的代码,为此目的重构大量代码似乎是一个 PITA。

或者,这可能会有所帮助(不过,我不能肯定地说,因为我自己没有尝试过): http ://circlical.com/blog/2016/3/9/preparing-for-zend-f

于 2017-01-03T12:15:46.300 回答