Zend framework PHP已弃用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器

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安装了zend工具

$ 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
    “zendframework/zend mvc:~2.6.0”
    将锁定 特别适用于2.6系列,不会安装2.7系列)。 同样,这只是掩盖了问题,并有可能留下您的错误 如果安全修补程序应用于以后的次要应用程序,则应用程序不安全 zend mvc的发布
  • 将代码修复为不再使用
    getServiceLocator()
    。这是推荐的路径。通往 完成后一点是为了确保 在实例化过程中注入控制器
这意味着:

  • 您需要为控制器创建工厂
  • 您需要更新控制器以接受其构造函数中以前从
    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,
        /* ... */
        ],
        /* ... */
    ],
    /* ... */
];
];