symfony2:控制器中的服务访问抛出异常"错误:在非对象"上调用成员函数get()


symfony2: service access in controller throws exception - "Error: Call to a member function get() on a non-object"

我在src'trollmaster'TrollBundle'Services'DefaultService.php做了一个服务

namespace trollmaster'TrollBundle'DefaultService;
class DefaultService
{
    protected $example;
    protected function exampleFunction()
    {
        return null;
    }
}
我资源' config ' services.yml

:

services:
    trollmaster.default_service:
        class: trollmaster'TrollBundle'DefaultService

和命令php app/console container:debug正确返回了我的服务名称,但是当我想在控制器的构造中调用该服务时:

$this->DefaultService = $this->get("trollmaster.default_service");

看到这个错误:

Error: Call to a member function get() on a non-object

我做错了什么?


编辑:

当我想将controller定义为service

/**
 * @Route(service="DefaultController")
 */
class DefaultController

I got error:

ClassNotFoundException: Attempted to load class "DefaultController" from namespace "trollmaster'TrollBundle

原因是容器被注入到实现ContainerAwareInterface的控制器

…(即通过扩展Symfony'Bundle'FrameworkBundle'Controller'Controller)…

…通过 setter注入


TLDR:在对象构造完成后执行 setter注入。

因此你不能做…

$service = $this->get('service');
// ... or ...
$service = $this->container->('service');

…在__construct()方法中,因为setContainer()方法没有被调用,$this->container还没有设置。

你可以在文档中了解更多不同类型的注入。


看一下下面的代码部分:

  • Controller延伸ContainerAware

  • ContainerAware提供了setContainer()方法这里

这是因为构造函数不知道容器(就像nifr解释的那样)。但你可以将控制器本身定义为服务。我想这是最好的做法,尽管我不知道你想要达到什么目的。

相关文章: