【问题标题】:Can't inject EntityManager to constructor in some circumstances在某些情况下无法将 EntityManager 注入构造函数
【发布时间】:2014-04-27 19:33:16
【问题描述】:

我遇到了一些奇怪的情况。我已经定义了一个服务,并将其 EntityManager 作为 Controller 构造函数的参数。当我试图在其他构造函数中获取我的服务(这是构造函数)时,一切正常。但是当我直接打开作为服务的构造函数时,我看到:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to 
Webrama\PbsTreeBundle\Controller\PbsTreeController::__construct() must be an instance 
of Doctrine\ORM\EntityManager, none given, called in 
C:\www\strefaurody\bb\app\cache\dev\classes.php on line 2374 and defined in 
C:\www\strefaurody\bb\src\Webrama\PbsTreeBundle\Controller\PbsTreeController.php
 line 16

我的 services.yml 看起来像这样:

services:
    pbs_tree_controller:
        class: Webrama\PbsTreeBundle\Controller\PbsTreeController
        arguments:
            entityManager: "@doctrine.orm.entity_manager

构造函数也很简单:

private $em;

        public function __construct(EntityManager $entityManager)
        {
            $this->em = $entityManager;
        }

奇怪的是,我正在从一个服务调用方法,该服务使用这个注入构造函数 EntityManager 实例并成功:

public function genratePbsTree()
        {

            $conn = $this->em->getConnection();

            $sql = "SELECT id_child AS id, TRIM(TRAILING '/' FROM path) AS path FROM pbs_node_to_node WHERE depth = 2";
            $stmt = $conn->prepare($sql);
            $stmt->execute();
            $result = $stmt->fetchAll();

            return $result;
        }

有请求的路由YML:

webrama_pbs_index:
    pattern:  /{page}
    defaults: { _controller: WebramaPbsTreeBundle:PbsTree:index, page: 1 }
    requirements:
      page:  \d+

webrama_pbs_brand_edit:
    pattern: /edit/{id}
    defaults: { _controller: WebramaPbsTreeBundle:PbsTree:edit, id: '' }
    requirements:
      id:  \d+
    options:
          expose: true

webrama_pbs_producer_add:
    pattern: /add/producer
    defaults: { _controller: WebramaPbsTreeBundle:PbsTree:addProducer }

webrama_pbs_series_add:
    pattern: /add/series
    defaults: { _controller: WebramaPbsTreeBundle:PbsTree:addSeries }

webrama_pbs_brand_add:
    pattern: /add/brand
    defaults: { _controller: WebramaPbsTreeBundle:PbsTree:addBrand }

【问题讨论】:

  • YAML 配置中没有结束引号,这只是复制粘贴错误吗?你也可以发布路由配置(只是这个控制器的行)?
  • 复制粘贴错误。也许问题是我将我的控制器定义为 YAML 中的服务。当我通过 GET 直接请求此控制器时,它不是用作我的服务而是控制器,因此不会注入 EntityManager。这只是一个理论。
  • 是的,这就是我想查看您的 YAML 配置的原因。这是一个典型的错误(我经常这样做)为控制器配置服务然后错误配置路由:控制器不会作为服务加载。
  • 我该如何解决?也许你可以回答我,这样我也可以在 Controller 和 Service 中使用 EntityManager :) ? -- 一开始就有YML。
  • 废话废话。现在是我第三次请你展示你的路由配置来帮助你。

标签: php symfony dependency-injection


【解决方案1】:

您在路由配置中使用“控制器”表示法:

_controller: WebramaPbsTreeBundle:PbsTree:index

如果你想拥有“控制器即服务”,你需要使用服务名称:

_controller: pbs_tree_controller:indexAction

在此处阅读更多信息:http://symfony.com/doc/current/cookbook/controller/service.html

【讨论】:

  • 谢谢。今天晚上去测试一下。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多