gpt4 book ai didi

php - 弃用:在功能系统中检索服务定位器 - ZF2

转载 作者:可可西里 更新时间:2023-10-31 23:10:43 25 4
gpt4 key购买 nike

我正在开发一个 ZF2 系统并且它运行良好,但是在我在其他计算机上克隆存储库之后出现了这个已弃用的错误:

You are retrieving the service locator from within the class Module\Controller\Controller. Please be aware that ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along with the ServiceLocatorAwareInitializer. You will need to update your class to accept all dependencies at creation, either via constructor arguments or setters, and use a factory to perform the injections. in /home/path/project/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php on line 258

composer.json:

"require": {
"php": ">=5.5",
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*",
"zendframework/zendframework": "~2.5",
"doctrine/doctrine-orm-module": "0.*",
"hounddog/doctrine-data-fixture-module": "0.0.*",
"imagine/Imagine": "~0.5.0"

当我在我的 Controller (扩展 Zend\Mvc\Controller\AbstractActionController)中检索服务时出现错误:

$this->getServiceLocator()->get("Module\Service\Service");

在 Zend\Mvc\Controller\AbstractController 的 Zend 核心是这样的:

public function getServiceLocator()
{
trigger_error(sprintf(
'You are retrieving the service locator from within the class %s. Please be aware that '
. 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along '
. 'with the ServiceLocatorAwareInitializer. You will need to update your class to accept '
. 'all dependencies at creation, either via constructor arguments or setters, and use '
. 'a factory to perform the injections.',
get_class($this)
), E_USER_DEPRECATED);

return $this->serviceLocator;
}

之前只有这个:

public function getServiceLocator()
{
return $this->serviceLocator;
}

我已经尝试了一切,有人知道我必须做什么吗?

最佳答案

什么都不用做。当您升级到 ZF3 时,您将不得不更改您的 Controller 类接收其依赖项的方式。

ZF2 支持两种依赖注入(inject)模式:通过服务定位器和通过构造函数。 ZF3 删除了“按服务位置”并要求“按构造函数”。所有这一切都有效地改变了依赖关系的解决方式,将解决方案从“及时”转移到“构建”。

您不是能够从任何地方获得服务,而是在施工时获得它们。按照以下几行更新您的代码:

namespace Module\Controller;

class Controller {
public function __construct(\Module\Service\Service $service) {
$this->service = $service;
}
}

在类的方法中需要的地方使用$this->service

然后使用 Controller 工厂创建您的 Controller ,如下所示:

function ($controllers) { 
$services = $controllers->getServiceLocator();
return new \Module\Controller\Controller($services->get('Module\Service\Service'));
}

更改在 Issue 5168 中讨论, 和 this blog post讨论了为什么使用服务定位器进行服务注入(inject)是一种反模式。

关于php - 弃用:在功能系统中检索服务定位器 - ZF2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com