7

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

$ composer require zendframework/zftool:dev-master 

zftool 已经安装,当我运行 php /vender/bin/zf.php modules list 它抛出警告

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

我正在使用 Ubuntu

4

1 回答 1

6

有几个解决方案:

  • 在您的 error_reporting 中,禁用E_USER_DEPRECATED报告。这只是掩盖了问题。
  • 固定到 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(或仅使用该属性!)
  • 如果当前不存在,请为您的控制器添加一个工厂。

所以:

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,
        /* ... */
        ],
        /* ... */
    ],
    /* ... */
];
];

这可能看起来有很多步骤。但是,它可以确保您的代码没有隐藏的依赖关系,提高代码的可测试性,并允许您做一些很酷的事情,例如通过配置替代替代品。

于 2016-05-10T13:11:59.113 回答