Symfony3控制器构造函数注入不起作用

lts*_*tar 6 php symfony

我想使用以下代码将EntityManager实例传递给我的控制器的构造函数:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Doctrine\ORM\EntityManager;

class UserController extends Controller
{

    public function __construct( EntityManager $entityManager )
    {
        // do some stuff with the entityManager
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过将参数放入service.yml文件来进行构造函数注入:

parameters:
#    parameter_name: value

services:
#    service_name:
#        class: AppBundle\Directory\ClassName
#        arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
    app.user_controller:
        class: AppBundle\Controller\UserController
        arguments: ['@doctrine.orm.entity_manager']
Run Code Online (Sandbox Code Playgroud)

service.yml包含在config.yml中,当我运行时

php bin/console debug:container app.user_controller

我明白了:

 Information for Service "app.user_controller"
 =============================================

 ------------------ ------------------------------------- 
  Option             Value                                
 ------------------ ------------------------------------- 
  Service ID         app.user_controller                  
  Class              AppBundle\Controller\UserController  
  Tags               -                                    
  Public             yes                                  
  Synthetic          no                                   
  Lazy               no                                   
  Shared             yes                                  
  Abstract           no                                   
  Autowired          no                                   
  Autowiring Types   -                                    
 ------------------ ------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

但是,调用映射到我的控制器的路由,我得到:

UserController.php第17行中的FatalThrowableError:类型错误:传递给AppBundle\Controller\UserController :: __ construct()的参数1必须是Doctrine\ORM\EntityManager的实例,没有给出,在/ home/michel/Documents/Terminfinder /中调用202号线上的vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

我无法弄清楚,为什么EntityManager没有被注入?

Bor*_*éry 5

使用基类时Controller.phpContainer通常由ControllerResolver.

基本上,您正试图混淆事物的实际运作方式。

要解决您的问题,您基本上有两种解决方案:

  1. 不要尝试注入依赖项,而是直接从您的操作/方法中的容器中获取它。

public function listUsers(Request $request) { $em = $this->container->get('doctrine.orm.entity_manager'); }

  1. 手动创建控制器但不扩展控制器基类;并将ip设置为服务

在这一点上更进一步,有些人会建议不要使用 Symfony 提供的默认控制器。

虽然我完全理解他们的观点,但我在这个问题上稍微温和一些。

仅注入所需的依赖项背后的想法是避免并强迫人们拥有瘦控制器,这一件好事。

但是,通过一些自动确定,使用现有的快捷方式要简单得多。

A Controller/Action只不过是你Views和你Domain/之间的粘合剂Models

防止自己在Controller使用ContainerAware设施时做太多事情。

一个Controller可以扔掉,没有产生在系统中的业务变化。