【发布时间】: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