J'ai créé mon propre service et j'ai besoin d'injecter doctrine EntityManager, mais je ne vois pas que cela __construct()
est appelé sur mon service et l'injection ne fonctionne pas.
Voici le code et les configurations:
<?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
}
}
Voici services.yml
dans mon bundle
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments:
entityManager: "@doctrine.orm.entity_manager"
J'ai importé ce .yml config.yml
dans mon application comme ça
imports:
# a few lines skipped, not relevant here, i think
- { resource: "@TestCommonBundle/Resources/config/services.yml" }
Et quand j'appelle le service dans le contrôleur
$userservice = $this->get('test.common.userservice');
$userservice->getUser(123);
$this->em
J'obtiens un objet (non nul), mais dans UserService est nul, et comme je l'ai déjà mentionné, le constructeur sur UserService n'a jamais été appelé
Encore une chose, Controller et UserService sont dans différents bundles (j'en ai vraiment besoin pour garder le projet organisé), mais quand même: tout le reste fonctionne bien, je peux même appeler
$this->get('doctrine.orm.entity_manager')
dans le même contrôleur que j'utilise pour obtenir UserService et obtenir un objet EntityManager valide (non nul).
On dirait qu'il me manque un morceau de configuration ou un lien entre UserService et Doctrine config.
la source
__constructor
est l'erreur.Réponses:
La méthode du constructeur de votre classe doit être appelée
__construct()
, pas__constructor()
:la source
public function __construct(EntityManagerInterface $entityManager)
Pour référence moderne, dans Symfony 2.4+, vous ne pouvez plus nommer les arguments de la méthode d'injection de constructeur. Selon la documentation que vous transmettriez:
Et puis ils seraient disponibles dans l'ordre dans lequel ils ont été listés via les arguments (s'il y en a plus d'un).
la source
Remarque à partir de Symfony 3.3 EntityManager est déprécié. Utilisez plutôt EntityManagerInterface.
la source
Depuis 2017 et Symfony 3.3, vous pouvez enregistrer Repository en tant que service , avec tous ses avantages.
Consultez mon article Comment utiliser le référentiel avec Doctrine as Service dans Symfony pour une description plus générale.
Pour votre cas spécifique, le code original avec réglage ressemblerait à ceci:
1. Utilisation dans vos services ou contrôleur
2. Créez un nouveau référentiel personnalisé
3. Enregistrer les services
la source