我想使用以下代码将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没有被注入?
使用基类时Controller.php,Container通常由ControllerResolver.
基本上,您正试图混淆事物的实际运作方式。
要解决您的问题,您基本上有两种解决方案:
public function listUsers(Request $request)
{
$em = $this->container->get('doctrine.orm.entity_manager');
}
在这一点上更进一步,有些人会建议不要使用 Symfony 提供的默认控制器。
虽然我完全理解他们的观点,但我在这个问题上稍微温和一些。
仅注入所需的依赖项背后的想法是避免并强迫人们拥有瘦控制器,这是一件好事。
但是,通过一些自动确定,使用现有的快捷方式要简单得多。
A Controller/Action只不过是你Views和你Domain/之间的粘合剂Models。
防止自己在Controller使用ContainerAware设施时做太多事情。
一个Controller可以扔掉,没有产生在系统中的业务变化。
| 归档时间: |
|
| 查看次数: |
6059 次 |
| 最近记录: |