Как вызвать Entity Manager в конструкторе?

Я пытался вызвать Entity Manager в конструкторе:

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

но, как я видел в этом ответе: вопрос о Stackoverflow , это невозможно.

Поэтому я задаюсь вопросом, есть ли способ достичь этого, поскольку я должен часто его называть, и хочу сделать некоторые вещи в конструкторе после получения репозитория.

Редактировать:

Я пробовал ответить @MKhalidJunaid:

 //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) { ... 

но я получаю эту ошибку:

 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) 

Новая попытка:

Я также попробовал ответить @praxmatig:

 //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 } 

но я получаю эту ошибку:

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

Вам нужно сделать сервис для своего класса и передать администратор сущности доктрины в качестве аргумента doctrine.orm.entity_manager Как в services.yml

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

Вы должны импортировать свои services.yml в config.yml

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

Затем в конструкторе вашего класса получите диспетчер сущности в качестве аргумента

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

Надеюсь, это имеет смысл

Не расширяйте класс базового контроллера при регистрации контроллера как службы. Здесь есть документация.

 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 } 

Почему вы хотите захватить Doctrine 2 EntityManager в конструкторе контроллера?

Почему бы просто не сделать $em = $this->getDoctrine()->getManager(); (или $em = $this->getDoctrine()->getEntityManager(); в Symfony 2.0) в действии ( $em = $this->getDoctrine()->getEntityManager(); ) вам это нужно? Это избавит вас от накладных расходов при инициализации EntityManager, когда вам это не понадобится.

Если вы действительно этого хотите, есть четкие инструкции по определению контроллеров как служб . В основном это выглядит так:

 # 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 } 

Вы должны добавить

 use Doctrine\ORM\EntityManager; 

в вашем контроллере

Я вижу, что вы пытаетесь получить диспетчер объектов в конструкторе контроллера, и это не так, если вы не планируете определять свой контроллер как услугу. который в этом случае вам нужно использовать инъекцию зависимостей для ввода менеджера объектов службы.

Но в целом общий способ использования диспетчера сущностей в контроллере – просто получить его, используя следующий код:

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

Я думаю, что вы в правильном направлении, я бы взял второй вариант:

Для второго варианта я считаю, что определение внутри routing.yml неверно

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

Здесь просто удалите MSDHomeBundle из _controller внутри значений по умолчанию

Для первого варианта:

У HomeController есть собственный конструктор?

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

он может помочь затем внутри конструктора

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