Zend framework PHP已弃用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器
我已经使用composer安装了zend工具Zend framework PHP已弃用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器,zend-framework,zend-tool,Zend Framework,Zend Tool,我已经使用composer安装了zend工具 $ composer require zendframework/zftool:dev-master zftool已经安装,当我运行php/vender/bin/zf.php模块时,它会抛出警告 PHP已弃用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器。请注意,ServiceLocatorAwareInterface已弃用,将在版本3.0中与ServiceLocatorAwareInitiali
$ composer require zendframework/zftool:dev-master
zftool已经安装,当我运行php/vender/bin/zf.php模块时,它会抛出警告
PHP已弃用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器。请注意,ServiceLocatorAwareInterface已弃用,将在版本3.0中与ServiceLocatorAwareInitializer一起删除
我正在使用Ubuntu有几种解决方案:
- 在错误报告中,禁用
E\u USER\u已弃用的
报告。这 只是掩盖了问题李>
- 锁定到zend mvc的早期版本(例如。, composer require
将锁定 特别适用于2.6系列,不会安装2.7系列)。 同样,这只是掩盖了问题,并有可能留下您的错误 如果安全修补程序应用于以后的次要应用程序,则应用程序不安全 zend mvc的发布李>“zendframework/zend mvc:~2.6.0”
- 将代码修复为不再使用
。这是推荐的路径。通往 完成后一点是为了确保 在实例化过程中注入控制器getServiceLocator()
- 锁定到zend mvc的早期版本(例如。, composer require
- 您需要为控制器创建工厂
- 您需要更新控制器以接受其构造函数中以前从
中提取的依赖项。 例如,假设您的控制器中有如下内容:getServiceLocator()
$db=$this->getServiceLocator()->get('db\ApplicationAdapter')代码>
您将按如下方式更改代码:
- 将
$db
属性添加到类中
- 更新构造函数以接受数据库适配器,并将其分配给属性
- 将上面的行更改为简单的
$db=$this->db
(或者只使用属性!)
- 为控制器添加工厂(如果当前不存在)
因此:
你的工厂看起来像这样:
class YourControllerFactory
{
public function __invoke($container)
{
return new YourController($this->get('Db\ApplicationAdapter'));
}
}
在应用程序或模块配置中,您可以将此工厂映射到控制器:
return [
'controllers' => [
'factories' => [
YourController::class => YourControllerFactory::class,
/* ... */
],
/* ... */
],
/* ... */
];
];
这似乎需要很多步骤。但是,它可以确保您的代码没有隐藏的依赖项,提高代码的可测试性,并允许您通过配置来做一些很酷的事情,例如替换替代品。此错误发生在您更新zend之后。相信我,我在过去两天一直在寻找解决方案,但thr甚至没有一篇合适的文章来描述如何解决这个问题。我也收到了这个错误,并且没有找到解决方案或推荐的解决方案。我无法让它工作,直到在您的第二个代码块中,我更改了$this->get('
到$container->getServiceLocator()->get('
)。
return [
'controllers' => [
'factories' => [
YourController::class => YourControllerFactory::class,
/* ... */
],
/* ... */
],
/* ... */
];
];