He creado mi propio servicio y necesito inyectar la doctrina EntityManager, pero no veo que __construct()
se llame a mi servicio y la inyección no funciona.
Aquí está el código y las configuraciones:
<?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
}
}
Aquí está services.yml
en mi paquete
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments:
entityManager: "@doctrine.orm.entity_manager"
He importado ese .yml config.yml
en mi aplicación así
imports:
# a few lines skipped, not relevant here, i think
- { resource: "@TestCommonBundle/Resources/config/services.yml" }
Y cuando llamo al servicio en el controlador
$userservice = $this->get('test.common.userservice');
$userservice->getUser(123);
Obtengo un objeto (no nulo), pero $this->em
en UserService es nulo, y como ya mencioné, nunca se ha llamado al constructor en UserService
Una cosa más, Controller y UserService están en paquetes diferentes (realmente lo necesito para mantener el proyecto organizado), pero aún así: todo lo demás funciona bien, incluso puedo llamar
$this->get('doctrine.orm.entity_manager')
en el mismo controlador que utilizo para obtener UserService y obtener un objeto EntityManager válido (no nulo).
Parece que me falta una pieza de configuración o algún vínculo entre UserService y la configuración de Doctrine.
fuente
__constructor
es el error.Respuestas:
Se debe llamar al método constructor de su clase
__construct()
, no__constructor()
:fuente
public function __construct(EntityManagerInterface $entityManager)
Para una referencia moderna, en Symfony 2.4+, ya no puede nombrar los argumentos para el método Constructor Injection. Según la documentación pasarías:
Y luego estarán disponibles en el orden en que se enumeraron a través de los argumentos (si hay más de 1).
fuente
Tenga en cuenta que Symfony 3.3 EntityManager está depreciado. Utilice EntityManagerInterface en su lugar.
fuente
Desde 2017 y Symfony 3.3 puedes registrar Repository como servicio , con todas las ventajas que tiene.
Consulte mi publicación Cómo usar el repositorio con Doctrine como servicio en Symfony para obtener una descripción más general.
Para su caso específico, el código original con ajuste se vería así:
1. Uso en sus servicios o controlador
2. Crea un nuevo repositorio personalizado
3. Registrar servicios
fuente