Symfony2 Use Doctrine in Service Container

DoctrineSymfony

Doctrine Problem Overview


How do I use Doctrine in a service container?

The Code just causes an error message "Fatal error: Call to undefined method ...::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 Solutions


Solution 1 - Doctrine

According to your code, you already have an EntityManager injected. You don't need to call $em = $this->get('doctrine')->getEntityManager() — just use $this->em.

If you don't inject an EntityManager already, read this.

UPDATE:

You need to make the container inject an EntityManager into your service. Here's an example of doing it in config.yml:

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

I prefer to define bundles' services in their own services.yml files, but that's a bit more advanced, so using config.yml is good enough to get started.

Solution 2 - Doctrine

For easily accessing the Entitymanager use the following one:

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

And in the class itself:

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

This is my first answer so any comments are appreciated :)

Solution 3 - Doctrine

Please try this code:

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

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

Solution 4 - Doctrine

For Symfony 3.x

The most easy-peasy solution for me was to just turn on autowiring/autoconfiguring, and then injecting the service I needed via the constructor. Note that I have also allowed any controller to be injected as a service by setting 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}'

Then in any service, you can inject & use the entity manager $em (or any other service/controller) via the constructor like this:

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

Solution 5 - Doctrine

for anyone who works with symfony3: u need to do the following inside config/services.yml in order to use doctrine in Service Container:

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

Solution 6 - Doctrine

in the Symfony 3.4. If you want to use Doctrine in a service you can do it: Only this method worked for me

services.yml:

YourBundle\PatchService\YourService:
      public: true
      arguments: [ '@doctrine.orm.entity_manager' ]

Service:

class YourService
{
    private $em;
    public function __construct($em)  {
        $this->em = $em;
    }

Controller:

use YourBundle\PatchService\YourService;

     /**
         * @Route("/YourController/",name="YourController")
         */
        public function indexAction()
        {
            $em = $this->getDoctrine()->getManager();
            $Notification = new  YourService($em);

Solution 7 - Doctrine

I am using Symfony 3.4. If you want to create a service in a bundle this works for me:

services:
 Vendor\YourBundle\Service\YourService:
   arguments:
     $em: '@doctrine.orm.entity_manager'

In your 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;
 }

}

Solution 8 - Doctrine

Since 2017 and Symfony 3.3 you can register Repository as service, with all its advantages it has.

Your code would change like this.

1. Service configuration
# app/config/services.yml
services:
    _defaults:
        autowire: true

    ...\Service\:
       resource: ...\Service
2. Create new class - custom repository:
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. Use in any Controller or Service like this
class dsdsf
{ 
    private $yourRepository;

    public function __construct(YourRepository $yourRepository)
    {
    	$this->yourRepository = $yourRepository;
    }

    public function create()
    {
        $id = 10;
        $this->yourRepository->find($id);
    }
}

Do you want to see more code and pros/cons lists?

Check my post How to use Repository with Doctrine as Service in Symfony.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1075510View Question on Stackoverflow
Solution 1 - DoctrineElnur AbdurrakhimovView Answer on Stackoverflow
Solution 2 - DoctrineMaXxer90View Answer on Stackoverflow
Solution 3 - DoctrineMourad MAMASSIView Answer on Stackoverflow
Solution 4 - DoctrineNiket PathakView Answer on Stackoverflow
Solution 5 - DoctrineAchref GassoumiView Answer on Stackoverflow
Solution 6 - Doctrinepedram shabaniView Answer on Stackoverflow
Solution 7 - DoctrineHannomaView Answer on Stackoverflow
Solution 8 - DoctrineTomas VotrubaView Answer on Stackoverflow