it-swarm.com.de

Symfony2 Doctrine in Service Container verwenden

Wie verwende ich Doctrine in einem Service-Container?

Der Code verursacht nur die Fehlermeldung "Schwerwiegender Fehler: Aufruf an undefinierte Methode ... :: 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

Gemäß Ihrem Code haben Sie bereits eine EntityManager injiziert. Sie müssen $em = $this->get('doctrine')->getEntityManager() nicht aufrufen - verwenden Sie einfach $this->em.

Wenn Sie noch keine EntityManager injizieren, lesen Sie this .

AKTUALISIEREN:

Sie müssen dafür sorgen, dass der Container eine EntityManager in Ihren Dienst einfügt. Hier ein Beispiel in config.yml:

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

Ich bevorzuge die Dienste von define bundles in ihren eigenen services.yml-Dateien, aber das ist etwas fortgeschrittener, so dass die Verwendung von config.yml gut genug ist, um loszulegen.

85

Um auf den Entitymanager zuzugreifen, verwenden Sie den folgenden:

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

Und in der Klasse selbst:

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

Dies ist meine erste Antwort, also werden alle Kommentare geschätzt :)

9
MaXxer90

Bitte versuche diesen Code:

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

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

Für Symfony 3.x

Die einfachste und einfachste Lösung für mich war, einfach das automatische Anwählen/Konfigurieren der automatischen Konfiguration zu aktivieren und dann den erforderlichen Dienst über den Konstruktor einzufügen. Beachten Sie, dass ich auch die Einstellung eines beliebigen Controllers als Dienst zugelassen habe, indem Sie resource: '../../src/AppBundle/*' einstellen. 

 #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}'

In jedem Dienst können Sie den Entitätsmanager $em (oder einen beliebigen anderen service/controller) über den Konstruktor wie folgt einfügen und verwenden:

// 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

für alle, die mit symfony3 arbeiten: Sie müssen folgende Einstellungen in config/services.yml ausführen, um doctrine in Service Container verwenden zu können:

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

im Symfony 3.4. Wenn Sie Doctrine in einem Dienst verwenden möchten, können Sie dies tun: Nur diese Methode hat für mich funktioniert

services.yml :

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

Bedienung :

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);
1
pedram shabani

Seit 2017 und Symfony 3.3 Sie können Repository als Dienst registrieren mit allen ihren Vorteilen registrieren. 

Ihr Code würde sich so ändern.

1. Dienstkonfiguration

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

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

2. Erstellen Sie eine neue Klasse - benutzerdefiniertes 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. In jedem Controller oder Dienst wie diesem verwenden

class dsdsf
{ 
    private $yourRepository;

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

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

Möchten Sie weitere Code- und Pro/Cons-Listen anzeigen? 

Überprüfen Sie meinen Beitrag So verwenden Sie Repository mit Doctrine as Service in Symfony.

0
Tomáš Votruba

Ich benutze Symfony 3.4. Wenn Sie einen Service in einem Bundle erstellen möchten, funktioniert das für mich:

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

In Ihrer 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