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

Har*_*llu 7 zend-framework zend-tool

我已经使用composer安装了zend工具

$ composer require zendframework/zftool:dev-master 
Run Code Online (Sandbox Code Playgroud)

已经安装了zftool,当我运行php /vender/bin/zf.php模块时,它会抛出警告

PHP不推荐使用:您正在从类ZFTool\Controller\ModuleController中检索服务定位器.请注意,ServiceLocatorAwareInterface已弃用,将在3.0版中与ServiceLocatorAwareInitializer一起删除....

我正在使用Ubuntu

Ole*_*aev 6

有几个解决方案:

  • 在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(/* ... */);
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

你的工厂看起来像这样:

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

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

return [
    'controllers' => [
        'factories' => [
            YourController::class => YourControllerFactory::class,
        /* ... */
        ],
        /* ... */
    ],
    /* ... */
];
];
Run Code Online (Sandbox Code Playgroud)

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