Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 在控制器类的构造函数中获取ServiceLocator_Zend Framework2_Php - Fatal编程技术网

Zend framework2 在控制器类的构造函数中获取ServiceLocator

Zend framework2 在控制器类的构造函数中获取ServiceLocator,zend-framework2,php,Zend Framework2,Php,我正在构建一个模块。我想访问控制器类构造函数中的ServiceLocator public function __construct() { var_dump($this->getServiceLocator()->get('Config')); } 但它给出了以下错误 对非对象调用成员函数get 当我试着把它付诸实施时,它工作得非常完美- public function inAction() { $sm = $this->getServiceLocator(

我正在构建一个模块。我想访问控制器类构造函数中的ServiceLocator

public function __construct() {
    var_dump($this->getServiceLocator()->get('Config'));
}
但它给出了以下错误

对非对象调用成员函数get

当我试着把它付诸实施时,它工作得非常完美-

public function inAction() {
    $sm = $this->getServiceLocator();
    $config = $sm->get('Config');
}

在构造函数中获取ServiceLocator的正确方法是什么

在构建类时,ServiceLocator的依赖关系尚未注入。然后通过初始值设定项执行此操作

工作流程如下所示:

- controller called "My\Controller\FooController"
- resolve string to classname
- $ctrl = new FooController(); // This is where __construct() is called
if $ctrl instanceof AbstractActionController
    $ctrl->setServiceLocator($serviceLocator);
endif
- return $ctrl;
最简单的解决方法是在控制器中为自己编写一个惰性getter函数:

protected $config;

public function getConfig() {
    if (null === $this->config) {
        $this->config = $this->getServiceLocator()->get('config');
    }
    return $this->config;
}
这种方法会奏效,你会很高兴的。但是,您应该知道,这实际上不是最佳实践,因为您从另一个依赖项调用依赖项。更好的方法是将配置注入控制器

public function __construct(array $config) {
    $this->config = $config;
}
而不是一个可调用的,你写了一个工厂。这最多只能在模块类的getControllerConfig函数中完成


然后,配置将被注入到控制器中,并且它也将在_构造中可用,以防您想要剪切整个配置的特定部分。

在构建类时,ServiceLocator的依赖关系尚未被注入。然后通过初始值设定项执行此操作

工作流程如下所示:

- controller called "My\Controller\FooController"
- resolve string to classname
- $ctrl = new FooController(); // This is where __construct() is called
if $ctrl instanceof AbstractActionController
    $ctrl->setServiceLocator($serviceLocator);
endif
- return $ctrl;
最简单的解决方法是在控制器中为自己编写一个惰性getter函数:

protected $config;

public function getConfig() {
    if (null === $this->config) {
        $this->config = $this->getServiceLocator()->get('config');
    }
    return $this->config;
}
这种方法会奏效,你会很高兴的。但是,您应该知道,这实际上不是最佳实践,因为您从另一个依赖项调用依赖项。更好的方法是将配置注入控制器

public function __construct(array $config) {
    $this->config = $config;
}
而不是一个可调用的,你写了一个工厂。这最多只能在模块类的getControllerConfig函数中完成


然后,配置将被注入到您的控制器中,并且它也将在您的_构造中可用,以防您想要删除整个配置的特定部分。

谢谢@Sam这么好的回答。我尝试了第二种解决方案,但出现以下错误。可捕获的致命错误:传递给Auth\Controller\AuthController:的参数1::_构造必须是数组类型,没有给定,…@AshwiniAgarwal尝试var_dump$sl->get'config';然后看看它是否返回了在新的FooController调用之外执行的操作,并首先将其保存到一个变量中-这段代码应该可以工作-您是否从invokables数组中删除了contrller别名?@Sam。。我是否需要做一些其他配置更新,因为它没有从那里打印任何内容。我试着把回声“测试”;就在新的FooController之前,它什么也不打印;死亡;-那会有帮助的;再多了解一点背景,解释类似于这个答案:谢谢@Sam这么好的回答。我尝试了第二种解决方案,但出现以下错误。可捕获的致命错误:传递给Auth\Controller\AuthController:的参数1::_构造必须是数组类型,没有给定,…@AshwiniAgarwal尝试var_dump$sl->get'config';然后看看它是否返回了在新的FooController调用之外执行的操作,并首先将其保存到一个变量中-这段代码应该可以工作-您是否从invokables数组中删除了contrller别名?@Sam。。我是否需要做一些其他配置更新,因为它没有从那里打印任何内容。我试着把回声“测试”;就在新的FooController之前,它什么也不打印;死亡;-那会有帮助的;再多了解一点背景,解释与此答案类似: