Symfony 2 EntityManager注入服务

我创build了自己的服务,我需要注入EntityManager的教条,但是我没有看到__construct()在我的服务上被调用,并且注入不起作用。

这里是代码和configuration:

 <?php namespace Test\CommonBundle\Services; use Doctrine\ORM\EntityManager; class UserService { /** * * @var EntityManager */ protected $em; public function __constructor(EntityManager $entityManager) { var_dump($entityManager); exit(); // I've never saw it happen, looks like constructor never called $this->em = $entityManager; } public function getUser($userId){ var_dump($this->em ); // outputs null } } 

这是我的包中的services.yml

 services: test.common.userservice: class: Test\CommonBundle\Services\UserService arguments: entityManager: "@doctrine.orm.entity_manager" 

我已经在config.yml中导入了.yml config.yml的应用程序

 imports: # a few lines skipped, not relevant here, i think - { resource: "@TestCommonBundle/Resources/config/services.yml" } 

当我在控制器中调用服务

  $userservice = $this->get('test.common.userservice'); $userservice->getUser(123); 

我得到一个对象(不是null),但是在UserService中的$this->em是空的,正如我已经提到的,UserService上的构造函数从未被调用过

还有一件事,Controller和UserService是在不同的包中(我真的需要这样做来保持项目的组织),但仍然:其他的一切正常,我甚至可以打电话

 $this->get('doctrine.orm.entity_manager') 

在相同的控制器,我用来获取UserService并获得有效的(非空)EntityManager对象。

看起来我缺lessconfiguration或UserService和Doctrineconfiguration之间的一些链接。

您的类的构造函数方法应该被称为__construct() ,而不是__constructor()

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

对于现代的参考,在Symfony 2.4+中,不能再为构造函数注入方法命名参数。 根据您将通过的文件 :

 services: test.common.userservice: class: Test\CommonBundle\Services\UserService arguments: [ "@doctrine.orm.entity_manager" ] 

然后他们将按照他们通过参数列出的顺序(如果有多于1个)可用。

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

注意从Symfony 3.3开始,EntityManager被折旧。 改用EntityManagerInterface。

 namespace AppBundle\Service; use Doctrine\ORM\EntityManagerInterface; class Someclass { protected $em; public function __construct(EntityManagerInterface $entityManager) { $this->em = $entityManager; } public function somefunction() { $em = $this->em; ... } } 

自2017年和Symfony 3.3以来,您可以将Repository注册为服务 ,并具有其所有的优势。

检查我的post如何在Symfony中使用Repository与Doctrine作为服务来获得更为一般的描述。


对于您的具体情况,调整原始代码将如下所示:

1.在您的服务或控制器中使用

 <?php namespace Test\CommonBundle\Services; use Doctrine\ORM\EntityManagerInterface; class UserService { private $userRepository; // use custom repository over direct use of EntityManager // see step 2 public function __constructor(UserRepository $userRepository) { $this->userRepository = $userRepository; } public function getUser($userId) { return $this->userRepository->find($userId); } } 

2.创build新的自定义存储库

 <?php namespace Test\CommonBundle\Repository; use Doctrine\ORM\EntityManagerInterface; class UserRepository { private $repository; public function __construct(EntityManagerInterface $entityManager) { $this->repository = $entityManager->getRepository(UserEntity::class); } public function find($userId) { return $this->repository->find($userId); } } 

3.注册服务

 # app/config/services.yml services: _defaults: autowire: true Test\CommonBundle\: resource: ../../Test/CommonBundle