有几个解决方案:
- 在您的 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,
/* ... */
],
/* ... */
],
/* ... */
];
];
这可能看起来有很多步骤。但是,它可以确保您的代码没有隐藏的依赖关系,提高代码的可测试性,并允许您做一些很酷的事情,例如通过配置替代替代品。