2014-03-27 35 views
5

我使用简化的控制器,并且没有服务容器。我正在尝试将教条注入服务中。以下是错误:如何注入Symfony2服务的教条

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Acme\Controller\WebController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/hcs/Core/app/cache/dev/appDevDebugProjectContainer.php on line 3036 and defined in /home/hcs/Core/src/Acme/Controller/WebController.php line 28 

这里是我的服务DEF:

doctrine: 
    dbal: 
    driver: %database_driver% 
    host:  %database_host% 
    port:  %database_port% 
    dbname: %database_name% 
    user:  %database_user% 
    password: %database_password% 
    charset: UTF8 

    orm: 
    mappings: 
     Acme: 
     type: annotation 
     dir: %kernel.root_dir%/../src/Acme/Model 
     prefix: Acme\Model 
     alias: Model 
     is_bundle: false 

services: 
    WebController: 
    class: Acme\Controller\WebController 
    arguments: [@doctrine.orm.entity_manager ] 
    parent: elnur.controller.abstract 

而且我的课

use Doctrine\ORM\EntityManager; 

/** 
* @Service("WebController", parent="elnur.controller.abstract") 
*/ 
class WebController extends AbstractController 
{ 
    protected $em; 

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

这里是SF2容器(PHP应用程序/控制台容器输出:调试| grep -i ity)

doctrine.orm.default_entity_manager    container EntityManager5330e85ad5afb_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager 

doctrine.orm.entity_manager      n/a  alias for doctrine.orm.default_entity_manager     

doctrine.orm.validator.unique     container Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator 

form.type.entity        container Symfony\Bridge\Doctrine\Form\Type\EntityType 

translator          container Symfony\Component\Translation\IdentityTranslator 

我也在服务定义中尝试过参数:[“@ doctrine.orm.entity_manager”],但仍然没有任何结果。我试过清理我的缓存,但我不能为我的生活注入电磁脉冲。我究竟做错了什么?

+0

在何处以及如何被你调用这个服务? '[“@ doctrine.orm.entity_manager”]应该用于争论。 – Chausser

+0

我在config.yml中定义我的服务并提供上述参数。但是我在施工时遇到上述错误。 –

+0

你是如何构建它的?在一个控制器中使用:'$ WebController = $ this-> get('WebController');'或者你只是在做'$ WebController = new WebController()'? – Chausser

回答

7

问题是,您正在为同一个类混合YAML服务定义和DiExtra注释。 YAML定义已满,并提供所需的依赖关系,但您尚未添加@InjectParams以与@Service注释一起玩。基本上,您使用不同的方法创建单个类的两个服务,并且注释方法不完整。

无论是从类中删除@Service注释,或者,如果你喜欢的注释(这是我做的),与注释注入的依赖性太大,摆脱了YAML服务定义的:

/** 
* @InjectParams({ 
* "em" = @Inject("doctrine.orm.entity_manager") 
* }) 
*/ 
public function __construct(EntityManager $em) 
{ 
    $this->em = $em; 
} 

@InjectParams注解将诸如$em之类的参数名称匹配到服务名称,如@em。由于没有@em服务,您必须覆盖与@Inject注释的默认匹配。

但有一种方法可以简化它。您可以别名实体管理@em在YAML配置文件:

services: 
    em: 
     alias: doctrine.orm.entity_manager 

现在可以简化@InjectParams注释:

/** 
* @InjectParams 
*/ 
public function __construct(EntityManager $em) 
{ 
    $this->em = $em; 
}