【发布时间】:2017-01-21 12:55:20
【问题描述】:
我想使用以下代码将 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
}
}
我通过将参数放入 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']
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 -
------------------ -------------------------------------
但是,调用映射到我的控制器的路由,我得到:
UserController.php 第 17 行中的 FatalThrowableError:类型错误: 参数 1 传递给 AppBundle\Controller\UserController::__construct() 必须是一个实例 Doctrine\ORM\EntityManager 的,没有给出,调用 /home/michel/Documents/Terminfinder/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php 在第 202 行
我不明白,为什么 EntityManager 没有被注入?
【问题讨论】:
-
你清除缓存了吗?
-
@lxg 我使用 php bin/console cache:clear --env=dev 清除了缓存并手动删除了 var/cache/dev/*
-
将控制器声明为服务并不被 fabpot 自己认为是一种好的做法:github.com/symfony/symfony-docs/issues/457。我同意这一点。
-
@COil 我明白你的意思,但是有一篇关于如何将控制器用作服务的官方文档文章。 symfony.com/doc/current/controller/service.html
-
您需要配置路由以将控制器用作服务:symfony.com/doc/current/controller/… 并忽略反对者。将控制器定义为服务非常好。如果您仍然遇到问题,请使用您的路线更新问题。