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作为服务 。