Как использовать Doctrine в контейнере службы?
Код просто вызывает сообщение об ошибке "Неустранимая ошибка: вызов метода undefined...:: 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
, прочитайте this.
UPDATE:
Вам нужно сделать контейнер, введя EntityManager
в вашу службу. Вот пример этого в config.yml
:
services:
your.service:
class: YourVendor\YourBundle\Service\YourService
arguments: [ @doctrine.orm.entity_manager ]
Я предпочитаю определять пакеты в своих собственных файлах services.yml
, но немного более продвинутые, поэтому использование 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());
Самое легкое решение для меня состояло в том, чтобы просто включить autowiring/autoconfiguring, а затем впрыснуть сервис, который мне нужен через конструктор. Обратите внимание, что я также разрешил вводить любой контроллер в качестве службы, установив 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 removed anyway
exclude: '../../src/AppBundle/{Entity,Repository,Tests,DataFixtures,Form}'
Затем в любой службе вы можете вводить и использовать диспетчер сущностей $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" ]
в Symfony 3.4. Если вы хотите использовать Doctrine в службе, вы можете это сделать: только этот метод работал для меня
services.yml:
YourBundle\PatchService\YourService:
public: true
arguments: [ '@doctrine.orm.entity_manager' ]
Сервис:
class YourService
{
private $em;
public function __construct($em) {
$this->em = $em;
}
Контроллер:
use YourBundle\PatchService\YourService;
/**
* @Route("/YourController/",name="YourController")
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$Notification = new YourService($em);
Я использую 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;
}
}
С 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);
}
}
Вы хотите увидеть больше списков кода и профи/минусов?
Отметьте мой пост Как использовать репозиторий с помощью Doctrine как службы в Symfony.
@=service("doctrine.orm.entity_manager").getRepository("Namespace\Entity")