如何在服务容器中使用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
答案 0 :(得分:85)
根据您的代码,您已经注入了EntityManager
。您无需致电$em = $this->get('doctrine')->getEntityManager()
- 只需使用$this->em
。
如果您尚未注入EntityManager
,请阅读this。
更新:
您需要让容器为您的服务注入EntityManager
。以下是在config.yml
中执行此操作的示例:
services:
your.service:
class: YourVendor\YourBundle\Service\YourService
arguments: [ @doctrine.orm.entity_manager ]
我更喜欢在自己的services.yml
文件中使用define捆绑服务,但这有点高级,因此使用config.yml
就足以开始了。
答案 1 :(得分:9)
要轻松访问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();
}
}
这是我的第一个答案,所以任何评论都表示赞赏:)
答案 2 :(得分:4)
请尝试以下代码:
$em=$this->container->get('doctrine')->getEntityManager();
$rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId());
答案 3 :(得分:3)
对我来说,最简单易用的解决方案是打开自动装配/自动配置,然后通过构造函数注入我需要的服务。请注意,我还允许通过设置 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}'
然后在任何服务中,你可以注射&amp;通过构造函数使用实体管理器$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();
}
答案 4 :(得分:2)
对于使用symfony3的任何人:你需要在config / services.yml中执行以下操作才能在Service Container中使用doctrine:
servicename_manager:
class: AppBundle\Services\MyServiceClass
arguments: [ "@doctrine.orm.entity_manager" ]
答案 5 :(得分:1)
。
如果要在服务中使用Doctrine,可以执行以下操作: 只有这种方法对我有用services.yml :
exit()
服务:
YourBundle\PatchService\YourService:
public: true
arguments: [ '@doctrine.orm.entity_manager' ]
控制器:
class YourService
{
private $em;
public function __construct($em) {
$this->em = $em;
}
答案 6 :(得分:0)
自2017年以及Symfony 3.3 ,您可以将存储库注册为服务,具有其所具有的所有优势。
您的代码会发生这样的变化。
# app/config/services.yml
services:
_defaults:
autowire: true
...\Service\:
resource: ...\Service
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);
}
}
class dsdsf
{
private $yourRepository;
public function __construct(YourRepository $yourRepository)
{
$this->yourRepository = $yourRepository;
}
public function create()
{
$id = 10;
$this->yourRepository->find($id);
}
}
您想查看更多代码和优缺点列表吗?
查看我的帖子How to use Repository with Doctrine as Service in Symfony 。
答案 7 :(得分:0)
我正在使用Symfony 3.4。如果你想在一个包中创建一个服务,这对我有用:
services:
Vendor\YourBundle\Service\YourService:
arguments:
$em: '@doctrine.orm.entity_manager'
在您的Service.php中
<?php
namespace Hannoma\ElternsprechtagBundle\Service;
use Doctrine\ORM\EntityManager;
use Hannoma\ElternsprechtagBundle\Entity\Time;
class TimeManager
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
}