php symfony constructor entitymanager

php - ¿Cómo llamar a Entity Manager en un constructor?



symfony entitymanager (6)

No extienda la clase de controlador base cuando registre el controlador como un servicio. Hay una documentación sobre esto aquí

class ImageTestController { private $em; public function __construct(EntityManager $em) { $this->em = $em; } public function someAction() { // do something with $this->em } } // services.yml services: acme.controller.image_test: class: Acme/SomeBundle/Controller/ImageTestController // routing.yml acme: path: / defaults: { _controller: acme.controller.image_test:someAction }

Intenté llamar a Entity Manager en un constructor:

function __construct() { $this->getDoctrine()->getEntityManager(); ...

pero, como he visto en esta respuesta: Pregunta de Stackoverflow , no se puede hacer.

Entonces me pregunto si hay una manera de lograrlo, ya que tengo que llamarlo con frecuencia, y quiero hacer algunas cosas en el constructor después de obtener el repositorio.

Editar:

Lo he intentado con @MKhalidJunaid respuesta:

//src/MSD/HomeBundle/Resources/config/services.yml services: imageTransController.custom.service: class: MSD/HomeBundle/Controller/ImageTransController arguments: EntityManager: "@doctrine.orm.entity_manager"

-

//app/config/config.php imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: doctrine_extensions.yml } - { resource: "@MSDHomeBundle/Resources/config/services.yml" }

-

//src/MSD/HomeBundle/Controller/ImageTransController.php namespace MSD/HomeBundle/Controller; use Doctrine/ORM/EntityManager; use MSD/HomeBundle/Entity/Imagen as Imagen; use MSD/HomeBundle/Controller/HomeController as HomeController; class ImageTransController extends HomeController { protected $em ; function __construct(EntityManager $entityManager) { ...

pero estoy obteniendo este error:

Catchable Fatal Error: Catchable Fatal Error: Argument 1 passed to MSD/HomeBundle/Controller/ImageTransController::__construct() must be an instance of Doctrine/ORM/EntityManager, none given, called in /home/manolo/MiServer/itransformer/app/cache/dev/jms_diextra/controller_injectors/MSDHomeBundleControllerImageTransController.php on line 13 and defined in /home/manolo/MiServer/itransformer/src/MSD/HomeBundle/Controller/ImageTransController.php line 38 (500 Internal Server Error)

Nuevo intento:

También he intentado con @praxmatig respuesta:

//services.yml parameters: msd.controller.imagetrans.class: MSD/HomeBundle/Controller/ImageTransController services: msd.imagetrans.controller: class: "%msd.controller.imagetrans.class%" arguments: [ @doctrine.orm.entity_manager ]

-

//ImageTransController.php namespace MSD/HomeBundle/Controller; use Doctrine/ORM/EntityManager; class ImageTransController { protected $em ; function __construct(EntityManager $em) { $this->em = $em; } ...

-

//routing.yml msd_home_cambiardimensiones: pattern: /cambiardimensiones defaults: { _controller: MSDHomeBundle:msd.imagetrans.controller:cambiardimensionesAction }

pero obtengo este error:

Unable to find controller "MSDHomeBundle:msd.imagetrans.controller" - class "MSD/HomeBundle/Controller/msd.imagetrans.controllerController" does not exist. (500 Internal Server Error)


Necesita hacer un servicio para su clase y pasar el administrador de entidades de doctrina como el argumento doctrine.orm.entity_manager .Me gusta en services.yml

services: test.cutom.service: class: Test/YourBundleName/Yourfoldernameinbundle/Test #arguments: arguments: [ @doctrine.orm.entity_manager ] #entityManager: "@doctrine.orm.entity_manager"

Debe importar sus services.yml en config.yml

imports: - { resource: "@TestYourBundleName/Resources/config/services.yml" }

Luego, en el constructor de tu clase obtén el administrador de la entidad como argumento

use Doctrine/ORM/EntityManager; Class Test { protected $em; public function __construct(EntityManager $entityManager) { $this->em = $entityManager; } }

Espero que esto tenga sentido


Tienes que agregar

use Doctrine/ORM/EntityManager;

en tu controlador


¿Por qué quiere tomar Doctrine 2 EntityManager en el constructor de un controlador?

¿Por qué no simplemente hacer $em = $this->getDoctrine()->getManager(); (o $em = $this->getDoctrine()->getEntityManager(); en Symfony 2.0) en la (s) acción (es) que lo necesita? Esto le ahorra la sobrecarga de inicializar EntityManager cuando no lo necesita.

Si realmente desea hacer esto, hay instrucciones claras sobre Cómo definir controladores como servicios . Básicamente se ve así:

# src/MSD/HomeBundle/Controller/ImageTransController.php namespace MSD/HomeBundle/Controller; use Doctrine/ORM/EntityManager; class ImageTransController { private $em; public function __construct(EntityManager $em) { $this->em = $em; } public function indexAction() { // use $this->em } } # src/MSD/HomeBundle/Resources/config/services.yml parameters: msd.controller.image_trans.class: MSD/HomeBundle/Controller/ImageTransController services: msd.controller.image_trans: class: "%msd.controller.image_trans.class%" arguments: ["@doctrine.orm.default_entity_manager"] # app/config/routing.yml msd_home_cambiardimensiones: path: /cambiardimensiones defaults: { _controller: msd.controller.image_trans:indexAction }


Creo que estás en la dirección correcta, tomaría la segunda opción:

Para la segunda opción, creo que la definición dentro de routing.yml es incorrecta

//routing.yml msd_home_cambiardimensiones: pattern: /cambiardimensiones defaults: { _controller: msd.imagetrans.controller:cambiardimensionesAction }

Aquí solo elimine MSDHomeBundle del _controller dentro de los valores predeterminados

Para la primera opción:

¿HomeController tiene su propio constructor?

//src/MSD/HomeBundle/Resources/config/services.yml services: imageTransController.custom.service: class: MSD/HomeBundle/Controller/ImageTransController arguments: [@doctrine]

podría ayudar entonces dentro del constructor

__construct(Registry $doctrine) $this->doctrine = $doctrine; or $this->em = $doctrine->getManager();


Veo que está tratando de obtener el administrador de entidades en el constructor del controlador, que no es la manera de hacerlo, a menos que planee definir su controlador como un servicio. que en este caso, necesita usar la inyección de dependencia para inyectar el administrador de entidad de servicio.

Pero, en general, la forma más común de usar el administrador de entidades en un controlador es simplemente obtenerlo usando el siguiente código:

$entityManager = $this->container->get(''doctrine.orm.entity_manager'');