web-dev-qa-db-fra.com

Symfony2 Use Doctrine dans Service Container

Comment utiliser Doctrine dans un conteneur de services?

Le code provoque simplement un message d'erreur "Erreur fatale: appel d'une méthode non définie ... :: 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
54
user1075510

Selon votre code, vous avez déjà une EntityManager injectée. Vous n'avez pas besoin d'appeler $em = $this->get('doctrine')->getEntityManager() - utilisez simplement $this->em.

Si vous n'injectez pas déjà une EntityManager, lisez this .

METTRE À JOUR:

Vous devez faire en sorte que le conteneur injecte une EntityManager dans votre service. Voici un exemple de le faire dans config.yml:

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

Je préfère define regrouper les services dans leurs propres fichiers services.yml, mais c'est un peu plus avancé, utiliser config.yml est donc suffisant pour commencer.

85

Pour accéder facilement à Entitymanager, utilisez celui-ci:

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

Et dans la classe même:

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

C’est ma première réponse donc tous les commentaires sont appréciés :)

9
MaXxer90

S'il vous plaît essayez ce code:

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

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

Pour Symfony 3.x

La solution la plus simple pour moi consistait simplement à activer le câblage automatique/la configuration automatique, puis à injecter le service dont j'avais besoin via le constructeur. Notez que j’ai également autorisé l’injection de tout contrôleur en tant que service en définissantresource: '../../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}'

Ensuite, dans n'importe quel service, vous pouvez injecter et utiliser le gestionnaire d'entités $em (ou tout autre service/controller ) via le constructeur comme ceci:

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

pour toute personne travaillant avec symfony3: u devez procéder comme suit dans config/services.yml pour pouvoir utiliser la doctrine dans le conteneur de service:

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

dans le Symfony 3.4. Si vous voulez utiliser Doctrine dans un service, vous pouvez le faire: Seule cette méthode a fonctionné pour moi

services.yml :

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

Un service :

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

Manette :

use YourBundle\PatchService\YourService;

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

Depuis 2017 et Symfony 3.3, vous pouvez enregistrer Repository en tant que service, avec tous ses avantages. 

Votre code changerait comme ça.

1. Configuration du service

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

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

2. Créez une nouvelle classe - référentiel personnalisé:

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. Utilisez dans n'importe quel contrôleur ou service comme celui-ci

class dsdsf
{ 
    private $yourRepository;

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

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

Voulez-vous voir plus de codes et de listes avantages/inconvénients? 

Check my post Comment utiliser Repository avec Doctrine as Service dans Symfony.

0
Tomáš Votruba

J'utilise Symfony 3.4. Si vous voulez créer un service dans un bundle, cela fonctionne pour moi:

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

Dans votre 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
Hannoma