Symfony2 usa Doctrine en Service Container
symfony access container (7)
Para Symfony 3.x
La solución más sencilla para mí fue simplemente activar autoconexión / autoconfiguración, y luego inyectar el servicio que necesitaba a través del constructor. Tenga en cuenta que también he permitido que cualquier controlador se inyecte como un servicio al establecer el resource: ''../../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}''
Luego, en cualquier servicio, puede inyectar y usar el gestor de entidades $em
(o cualquier otro servicio / controlador ) a través del constructor de esta manera:
// 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();
}
¿Cómo uso Doctrine en un contenedor de servicio?
El código solo causa un mensaje de error "Error fatal: llamada al método indefinido ... :: 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
De acuerdo con su código, ya tiene un EntityManager
inyectado. No necesita llamar $em = $this->get(''doctrine'')->getEntityManager()
- solo use $this->em
.
Si no se inyecta un EntityManager
, lea this .
ACTUALIZAR:
EntityManager
hacer que el contenedor EntityManager
un EntityManager
en su servicio. Aquí hay un ejemplo de hacerlo en config.yml
:
services:
your.service:
class: YourVendor/YourBundle/Service/YourService
arguments: [ @doctrine.orm.entity_manager ]
Prefiero define los servicios de bundles en sus propios archivos services.yml
, pero eso es un poco más avanzado, por lo que usar config.yml
es lo suficientemente bueno para comenzar.
Estoy usando Symfony 3.4. Si desea crear un servicio en un paquete, esto funciona para mí:
services:
Vendor/YourBundle/Service/YourService:
arguments:
$em: ''@doctrine.orm.entity_manager''
En su 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;
}
}
Para acceder fácilmente a Entitymanager, use el siguiente:
//services.yml
your service here:
class: yourclasshere
arguments: [@doctrine.orm.entity_manager]
Y en la clase en sí:
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();
}
}
Esta es mi primera respuesta, así que cualquier comentario es apreciado :)
Por favor prueba este código:
$em=$this->container->get(''doctrine'')->getEntityManager();
$rolescheduels=$em->getRepository(''OCSOCSBundle:RoleScheduel'')->findByUser($user->getId());
para cualquiera que trabaje con symfony3: necesitas hacer lo siguiente dentro de config / services.yml para usar doctrine en Service Container:
servicename_manager:
class: AppBundle/Services/MyServiceClass
arguments: [ "@doctrine.orm.entity_manager" ]
Desde 2017 y Symfony 3.3 puede registrar Repository como servicio , con todas sus ventajas.
Tu código cambiaría así.
1. Configuración del servicio
# app/config/services.yml
services:
_defaults:
autowire: true
.../Service/:
resource: .../Service
2. Crear nueva clase - repositorio personalizado :
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. Use en cualquier controlador o servicio como este
class dsdsf
{
private $yourRepository;
public function __construct(YourRepository $yourRepository)
{
$this->yourRepository = $yourRepository;
}
public function create()
{
$id = 10;
$this->yourRepository->find($id);
}
}
¿Desea ver más códigos y listas de pros y contras?
Verifique mi publicación Cómo usar el repositorio con Doctrine como servicio en Symfony .