传递给控制器​​的参数必须是ContainerInterface的实例,给出appDevDebugProjectContainer的实例

时间:2015-01-14 15:52:30

标签: symfony dependency-injection sonata

为什么会出现此错误?

  

捕获致命错误:传递给Application \ Sonata \ ProductBundle \ Controller \ ProductAdminController :: __ construct()的参数1必须是ContainerInterface的实例,appDevDebugProjectContainer的实例给出

这是我的services.yml:

services:
    product_admin_controller:
      class: Application\Sonata\ProductBundle\Controller\ProductAdminController
      arguments: ["@service_container"]
      tags:
            - { name: doctrine.event_listener, event: postLoad, connection: default  }

我的控制员:

class ProductAdminController extends Controller
{
    protected $container;

    public function __construct(\ContainerInterface $container)
    {
        $this->container = $container;
    }
}

2 个答案:

答案 0 :(得分:3)

你必须通过"来电"注入容器。选项,而不是我认为的论点:

services:
    product_admin_controller:
      class: Application\Sonata\ProductBundle\Controller\ProductAdminController
      arguments: ["@another_service_you_need"]
      tags:
            - { name: doctrine.event_listener, event: postLoad, connection: default  }
      calls:
            -   [ setContainer,["@service_container"] ]

另外,不要忘记创建公共方法" setContainer()"在你的听众课程中。

答案 1 :(得分:1)

首先,你为什么要尝试使用__constract()?相反,你必须使用setContainer()方法,它将ContainerInterface $ container作为参数,它应该如下所示:

<?php
...
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;

...
class YourClass extends Controller
{

    public function setContainer(ContainerInterface $container = null)
    {
        // your stuff
    }
}

第二个问题:你需要将容器注入控制器?您可以使用$ this-&gt; get('{service_id}')语句调用任何服务,而不是直接调用容器。