Symfony2 использует доктрину в служебном контейнере

54

Как использовать 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
Теги:
doctrine

8 ответов

83

В соответствии с вашим кодом у вас уже есть 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 достаточно хорошо, чтобы начать.

  • 1
    Вы имеете в виду, как это? $ This-> em-> getRepository ( '...') -> находка ($ ID); «atchable Fatal Error: Аргумент 1 передан ... :: __ construct () должен быть экземпляром Doctrine \ ORM \ EntityManager, ни один не указан»
  • 1
    Да, я имел в виду это. Вы получаете эту ошибку, потому что вы не внедряете EntityManager из контейнера. Я обновлю свой ответ.
Показать ещё 4 комментария
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();
  }
}

Это мой первый ответ, поэтому любые комментарии приветствуются:)

  • 7
    Пример класса, который вы опубликовали, не является допустимым PHP. Поправьте свой пример, и я дам вам голос.
  • 2
    Вы пропустили 2 полуколонны
Показать ещё 2 комментария
4

Пожалуйста, попробуйте этот код:

 $em=$this->container->get('doctrine')->getEntityManager();

 $rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId());
3

Для Symfony 3.x

Самое легкое решение для меня состояло в том, чтобы просто включить 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();
}
2

для тех, кто работает с symfony3: вам нужно сделать следующее внутри config/services.yml, чтобы использовать доктрину в Service Container:

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

в 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);
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;
 }

}
0

С 2017 года и Symfony 3.3 вы можете зарегистрировать репозиторий как сервис со всеми его преимуществами.

Ваш код изменился бы так.

1. Конфигурация службы

# app/config/services.yml
services:
    _defaults:
        autowire: true

    ...\Service\:
       resource: ...\Service

2. Создать новый класс - пользовательский репозиторий:

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);
    }
}

Вы хотите увидеть больше списков кода и профи/минусов?

Отметьте мой пост Как использовать репозиторий с помощью Doctrine как службы в Symfony.

  • 0
    Почему бы не определить его в конфигурации службы в качестве аргумента? @=service("doctrine.orm.entity_manager").getRepository("Namespace\Entity")
  • 1
    Не зависящий от фреймворка PHP-код поверх специфичных для фреймворка-config-yaml знаний.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню