为什么会出现此错误?
可捕获的致命错误:参数 1 传递给应用程序\Sonata\ProductBundle\Controller\ProductAdminController::__construct() 必须是 ContainerInterface 的实例,给定的 appDevDebugProjectContainer 的实例
这是我的服务.yml:
services:
product_admin_controller:
class: ApplicationSonataProductBundleControllerProductAdminController
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;
}
}
您必须通过"调用"选项注入容器,而不是我认为作为参数:
services:
product_admin_controller:
class: ApplicationSonataProductBundleControllerProductAdminController
arguments: ["@another_service_you_need"]
tags:
- { name: doctrine.event_listener, event: postLoad, connection: default }
calls:
- [ setContainer,["@service_container"] ]
另外,不要忘记在侦听器类中创建公共方法"setContainer()"。
首先,你为什么要尝试使用 __constract()?相反,您必须使用 setContainer() 方法,该方法将 ContainerInterface $container 作为参数,它应该看起来像这样:
<?php
...
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentDependencyInjectionContainerInterface;
...
class YourClass extends Controller
{
public function setContainer(ContainerInterface $container = null)
{
// your stuff
}
}
第二个问题:您需要将容器注入控制器是为了什么?您可以使用 $this->get('{service_id}') 语句调用任何服务,而不是直接调用容器。