Я пытался вызвать 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();