php - Symfony Controller 构造函数注入(inject)不起作用

标签 php symfony

我想使用以下代码将 EntityManager 实例传递到我的 Controller 的构造函数中:

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
    }
}

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

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']

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   -                                    
 ------------------ ------------------------------------- 

但是,调用映射到我的 Controller 的路由,我得到:

FatalThrowableError in UserController.php line 17: Type error: Argument 1 passed to AppBundle\Controller\UserController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/michel/Documents/Terminfinder/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php on line 202

我想不通,为什么 EntityManager 没有被注入(inject)?

最佳答案

使用基类时Controller.php Container 通常由 ControllerResolver 中的框架自动连接.

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

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

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

公共(public)函数列表用户(请求 $request) { $em = $this->container->get('doctrine.orm.entity_manager'); }

  1. 手动创建 Controller 但不扩展 Controller 基类;和 set ip up as a service

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

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

仅注入(inject)所需的依赖项背后的想法是避免并迫使人们拥有瘦 Controller ,这一件好事。

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

Controller/Action 只不过是 ViewsDomain 之间的粘合剂/模型

使用 ContainerAware 工具防止自己在 Controller 中做太多事情。

Controller 可以丢弃,而不会在您的系统中产生业务更改。

关于php - Symfony Controller 构造函数注入(inject)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779618/

相关文章:

php - Php7中的数组到字符串转换

php - 在循环中执行 Doctrine 查询时内存泄漏

symfony - 如何在 symfony2 中创建自定义存储库

php - Redis + phpredis 丢失 key ——内存溢出?

PHP HTML 截断和 UTF-8

php - 如何使用 PHP 将 JSON 值插入 MySQL 来创建 API?

php - 使用 http 请求程序,我可以发送键和值,但是当我通过浏览器发送相同的 url/编码值时,它无法接受值

php - 为什么 Symfony 5.1 不能识别 "routes.php"文件上配置的路由?

php - 如何销毁 Symfony 2 中的所有 session

php - 使用 PHP 和 MySQL 的用户推荐系统