Ich habe meinen eigenen Dienst erstellt und muss die Doktrin EntityManager injizieren, aber ich sehe nicht, dass dies __construct()
für meinen Dienst aufgerufen wird, und die Injektion funktioniert nicht.
Hier ist der Code und die Konfiguration:
<?php
namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManager;
class UserService {
/**
*
* @var EntityManager
*/
protected $em;
public function __constructor(EntityManager $entityManager)
{
var_dump($entityManager);
exit(); // I've never saw it happen, looks like constructor never called
$this->em = $entityManager;
}
public function getUser($userId){
var_dump($this->em ); // outputs null
}
}
Hier ist services.yml
in meinem Bundle
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments:
entityManager: "@doctrine.orm.entity_manager"
Ich habe diese .yml so config.yml
in meine App importiert
imports:
# a few lines skipped, not relevant here, i think
- { resource: "@TestCommonBundle/Resources/config/services.yml" }
Und wenn ich den Service im Controller anrufe
$userservice = $this->get('test.common.userservice');
$userservice->getUser(123);
Ich erhalte ein Objekt (nicht null), aber $this->em
in UserService ist null, und wie bereits erwähnt, wurde der Konstruktor in UserService nie aufgerufen
Eine weitere Sache, Controller und UserService sind in verschiedenen Paketen (ich brauche das wirklich, um das Projekt organisiert zu halten), aber trotzdem: Alles andere funktioniert gut, ich kann sogar anrufen
$this->get('doctrine.orm.entity_manager')
in demselben Controller, den ich verwende, um UserService abzurufen und ein gültiges (nicht null) EntityManager-Objekt abzurufen.
Sieht so aus, als ob mir eine Konfiguration oder eine Verbindung zwischen UserService und Doctrine config fehlt.
quelle
__constructor
der Fehler.Antworten:
Die Konstruktormethode Ihrer Klasse sollte aufgerufen werden
__construct()
, nicht__constructor()
:quelle
public function __construct(EntityManagerInterface $entityManager)
In Symfony 2.4+ können Sie die Argumente für die Constructor Injection-Methode nicht mehr benennen. Gemäß der Dokumentation würden Sie übergeben:
Und dann wären sie in der Reihenfolge verfügbar, in der sie über die Argumente aufgelistet wurden (wenn es mehr als 1 gibt).
quelle
Hinweis ab Symfony 3.3 EntityManager wird abgeschrieben. Verwenden Sie stattdessen EntityManagerInterface.
quelle
Seit 2017 und Symfony 3.3 können Sie Repository als Service mit all seinen Vorteilen registrieren .
Eine allgemeinere Beschreibung finden Sie in meinem Beitrag Verwendung von Repository mit Doctrine as Service in Symfony .
In Ihrem speziellen Fall würde der Originalcode mit Optimierung folgendermaßen aussehen:
1. Verwenden Sie in Ihren Diensten oder Controller
2. Erstellen Sie ein neues benutzerdefiniertes Repository
3. Dienste registrieren
quelle