我已经使用composer
安装了zend工具$ composer require zendframework/zftool:dev-master
zftool已安装,当我运行php /vender/bin/zf.php模块列出它发出警告
PHP已弃用:您正在从类ZFTool \ Controller \ ModuleController中检索服务定位器。请注意,ServiceLocatorAwareInterface已弃用,将在3.0版中与ServiceLocatorAwareInitializer一起删除。 ...
我正在使用Ubuntu
答案 0 :(得分:7)
有一些解决方案:
E_USER_DEPRECATED
报告。这个
只是掩盖了问题。 "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,
/* ... */
],
/* ... */
],
/* ... */
];
];
这可能看起来像很多步骤。但是,它确保您的代码没有隐藏的依赖关系,提高代码的可测试性,并允许您通过配置替换替代备选方案。