Symfony2 FOSRest控制器as服务有一个空容器

Symfony2 FOSRest控制器as服务有一个空容器,symfony,dependency-injection,Symfony,Dependency Injection,我已将我的控制器注册为服务,以便将存储库注入控制器。这一切似乎都很好,只是现在当我试图返回视图时,它在返回数据时出错 它给出一个错误并尝试加载fos\u rest.view\u handler: Error: Call to a member function get() on a non-object 正在symfony2控制器类中的$this->container->get($id)上调用get。由于某种原因,当我将控制器用作服务时,ContainerInterface不再被注入conta

我已将我的控制器注册为服务,以便将存储库注入控制器。这一切似乎都很好,只是现在当我试图返回视图时,它在返回数据时出错

它给出一个错误并尝试加载
fos\u rest.view\u handler

Error: Call to a member function get() on a non-object
正在symfony2控制器类中的
$this->container->get($id)
上调用get。由于某种原因,当我将控制器用作服务时,
ContainerInterface
不再被注入
containerware

以前有人遇到过这个问题吗?如何确保注入相同的容器

以下是我将类声明为服务的方式:

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service id="acme.users.apibundle.controller.user_controller" class="Acme\Users\ApiBundle\Controller\UserController">
            <argument type="service" id="acme.users.user_repository"/>
        </service>
    </services>
</container>

您需要使用
调用
将容器注入控制器,以便在
handleView
方法中可以使用该容器

将配置更改为

<container xmlns="http://symfony.com/schema/dic/services"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
    <service id="acme.users.apibundle.controller.user_controller" class="Acme\Users\ApiBundle\Controller\UserController">
        <argument type="service" id="acme.users.user_repository"/>
        <!-- inject the container via the setContainer method -->
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>
</services>


我担心这一点,当ContainerWare在任何地方加载时,我们是否无法自动执行此操作?ContainerWare不会更改服务-您必须调用setContainer。您还可以手动注入ViewHandler,构建视图,从而驱动整个控制器服务,而不是扩展FOSRestController。示例:LiipHelloBundle有一些示例,您可以侦听
内核.controller
事件,检查控制器是否具有
ContainerWareInterface
并将容器注入其中。或者,您可以将视图处理程序插入到
\u构造中
,并使用该服务而不是容器调用覆盖
handleView
方法。您可以覆盖内核请求分派器使用的控制器解析程序。但这并不值得。
<container xmlns="http://symfony.com/schema/dic/services"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
    <service id="acme.users.apibundle.controller.user_controller" class="Acme\Users\ApiBundle\Controller\UserController">
        <argument type="service" id="acme.users.user_repository"/>
        <!-- inject the container via the setContainer method -->
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>
</services>