PHP不推荐使用:您正在从类ZFTool \ Controller \ ModuleController中检索服务定位器

时间:2016-03-11 05:44:49

标签: 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版中与ServiceLocatorAwareInitializer一起删除。 ...

我正在使用Ubuntu

1 个答案:

答案 0 :(得分:7)

有一些解决方案:

  • 在您的error_reporting中,禁用E_USER_DEPRECATED报告。这个 只是掩盖了问题。
  • 固定到早期版本的zend-mvc(例如, 作曲家需要"zendframework/zend-mvc:~2.6.0"才会固定 特别是2.6系列,并不会安装2.7系列)。 这再次掩盖了问题,并可能留下您的问题 如果安全补丁应用于后续次要,则应用程序不安全 发布zend-mvc。
  • 修复您的代码不再使用 getServiceLocator()。这是推荐的路径。通往的方式 完成后一点是为了确保所有依赖关系 你的控制器是在实例化期间注入的。

这意味着:

  • 您需要为控制器创建工厂。
  • 您需要更新控制器以接受之前从getServiceLocator()中提取的构造函数中的依赖项。 举个例子,假设你的控制器里有这样的东西:

$db = $this->getServiceLocator()->get('Db\ApplicationAdapter');

您可以按如下方式更改代码:

  • 向您的班级添加$db媒体资源。
  • 更新构造函数以接受数据库适配器,并将其分配给属性。
  • 将上述行改为$db = $this->db(或只使用该属性!)
  • 为控制器添加工厂(如果当前不存在)。

所以:

use Zend\Db\Adapter\AdapterInterface;
use Zend\Mvc\Controller\AbstractActionController;

class YourController extends AbstractActionController
{
    private $db;

    public function __construct(AdapterInterface $db)
    {
        $this->db = $db;
    }

    public function someAction()
    {
        $results = $this->db->query(/* ... */);
        /* ... */
    }
}

你的工厂看起来像这样:

class YourControllerFactory
{
    public function __invoke($container)
    {
        return new YourController($this->get('Db\ApplicationAdapter'));
    }
}

在您的应用程序或模块配置中,您可以将此工厂映射到控制器:

return [
    'controllers' => [
        'factories' => [
            YourController::class => YourControllerFactory::class,
        /* ... */
        ],
        /* ... */
    ],
    /* ... */
];
];

这可能看起来像很多步骤。但是,它确保您的代码没有隐藏的依赖关系,提高代码的可测试性,并允许您通过配置替换替代备选方案。