传递给控制器的参数必须是 ContainerInterface 的实例,给定的 appDevDebugProjectCo



为什么会出现此错误?

可捕获的致命错误:参数 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}') 语句调用任何服务,而不是直接调用容器。

相关内容

  • 没有找到相关文章

最新更新