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

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

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

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

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

Edit:

Я пробовал ответить @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)

Ответ 1

Вам нужно сделать сервис для своего класса и передать диспетчер сущности доктрины в качестве аргумента doctrine.orm.entity_manager.Like в 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;
  }
}

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

Ответ 2

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

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 }

Ответ 3

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

Почему бы просто не сделать $em = $this->getDoctrine()->getManager(); (или $em = $this->getDoctrine()->getEntityManager(); в Symfony 2.0) в действии, которое вам нужно? Это избавит вас от накладных расходов при инициализации 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 }

Ответ 4

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

use Doctrine\ORM\EntityManager;

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

Ответ 5

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

Для второго варианта я считаю, что определение внутри 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();

Ответ 6

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

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

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