Symfony2在服务容器中使用Doctrine

如何在服务容器中使用Doctrine?

该代码只是导致错误消息“致命错误:调用未定义的方法… :: get()”。

<?php namespace ...\Service; use Doctrine\ORM\EntityManager; use ...\Entity\Header; class dsdsf { protected $em; public function __construct(EntityManager $em) { $this->em = $em; } public function create() { $id = 10; $em = $this->get('doctrine')->getEntityManager(); $em->getRepository('...')->find($id); } } 

services.yml

 service: site: class: ...\Service\Site 

根据你的代码,你已经注入了一个EntityManager 。 你不需要调用$em = $this->get('doctrine')->getEntityManager() – 只需使用$this->em

如果你没有注入一个EntityManager ,请阅读。

更新:

你需要让容器注入一个EntityManager到你的服务中。 这是一个在config.yml中执行的例子:

 services: your.service: class: YourVendor\YourBundle\Service\YourService arguments: [ @doctrine.orm.entity_manager ] 

我更喜欢在自己的services.yml文件中定义 bundles的服务,但是这有点高级,所以使用config.yml就足够了。

为了方便访问Entitymanager,请使用以下命令:

 //services.yml your service here: class: yourclasshere arguments: [@doctrine.orm.entity_manager] 

而在课堂本身:

 class foo { protected $em; public function __construct(\Doctrine\ORM\EntityManager $em) { $this->em = $em; } public function bar() { //Do the Database stuff $query = $this->em->createQueryBuilder(); //Your Query goes here $result = $query->getResult(); } } 

这是我的第一个回答,所以任何意见都赞赏:)

请试试这个代码:

  $em=$this->container->get('doctrine')->getEntityManager(); $rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId()); 

对于Symfony 3.x

对我来说最简单的解决scheme是打开自动assembly/自动configuration,然后通过构造函数注入我需要的服务。 请注意,我也允许通过设置resource: '../../src/AppBundle/*'将任何控制器作为服务注入resource: '../../src/AppBundle/*'

  #services.yml or config.yml services: _defaults: autowire: true autoconfigure: true public: false # Allow any controller to be used as a service AppBundle\: resource: '../../src/AppBundle/*' # you can exclude directories or files # but if a service is unused, it's removed anyway exclude: '../../src/AppBundle/{Entity,Repository,Tests,DataFixtures,Form}' 

然后在任何服务中,您可以通过如下构造函数注入&使用实体pipe理器$em (或任何其他服务/控制器 ):

 // class xyz private $em; // constructor public function __construct(\Doctrine\ORM\EntityManager $em) { $this->em = $em; } public function bar() { //Do the Database stuff $query = $this->em->createQueryBuilder(); //Your Query goes here $result = $query->getResult(); } 

对于任何使用symfony3的人来说:你需要在config / services.yml中执行以下的命令才能在Service Container中使用原则:

 servicename_manager: class: AppBundle\Services\MyServiceClass arguments: [ "@doctrine.orm.entity_manager" ] 

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

你的代码会像这样改变。

1.服务configuration

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

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

 use Doctrine\ORM\EntityManagerInterface; class YourRepository { private $repository; public function __construct(EntityManagerInterface $entityManager) { $this->repository = $entityManager->getRepository(YourEntity::class); } public function find($id) { return $this->repository->find($id); } } 

3.在这样的任何控制器或服务中使用

 class dsdsf { private $yourRepository; public function __construct(YourRepository $yourRepository) { $this->yourRepository = $yourRepository; } public function create() { $id = 10; $this->yourRepository->find($id); } } 

你想看更多的代码和优点/缺点清单吗?

检查我的post如何在Symfony中使用Repository与Doctrine作为服务