5

为什么我有这个错误?

可捕获的致命错误:传递给 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;
    }
}
4

2 回答 2

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()”。

于 2015-08-13T08:25:10.293 回答
1

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

<?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->get('{service_id}') 语句调用任何服务,而不是直接调用容器。

于 2015-01-15T06:06:22.573 回答