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
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.
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 :)
S'il vous plaît essayez ce code:
$em=$this->container->get('doctrine')->getEntityManager();
$rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId());
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();
}
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" ]
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);
Depuis 2017 et Symfony 3.3, vous pouvez enregistrer Repository en tant que service, avec tous ses avantages.
Votre code changerait comme ça.
# 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);
}
}
Voulez-vous voir plus de codes et de listes avantages/inconvénients?
Check my post Comment utiliser Repository avec Doctrine as Service dans Symfony.
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;
}
}