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

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

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

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

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

Edit:

я пробовал с @MKhalidJunaid ответ:

//src/MSD/HomeBundle/Resources/config/services.yml
services:
  imageTransController.custom.service:
    class:  MSDHomeBundleControllerImageTransController
    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 MSDHomeBundleController;

use DoctrineORMEntityManager;
use MSDHomeBundleEntityImagen as Imagen;
use MSDHomeBundleControllerHomeController as HomeController;


class ImageTransController extends HomeController
{
    protected $em ;

    function __construct(EntityManager $entityManager)
    {
    ...

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

Catchable Fatal Error: Catchable Fatal Error: Argument 1 passed to MSDHomeBundleControllerImageTransController::__construct() must be an instance of DoctrineORMEntityManager, 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: MSDHomeBundleControllerImageTransController

services:
  msd.imagetrans.controller:
    class:  "%msd.controller.imagetrans.class%"
    arguments: [ @doctrine.orm.entity_manager  ]

-

//ImageTransController.php
namespace MSDHomeBundleController;

 use DoctrineORMEntityManager;

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 "MSDHomeBundleControllermsd.imagetrans.controllerController" does not exist. (500 Internal Server Error)

6 ответов


вам нужно сделать сервис для вашего класса и передать doctrine entity manager в качестве аргумента doctrine.orm.entity_manager.Как на службе.в формате YML

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

вы должны импортировать свои услуги.YML в файл config.в формате YML

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

затем в конструкторе вашего класса получите entity manager в качестве аргумента

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 }

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

почему бы просто не сделать $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 }

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

use Doctrine\ORM\EntityManager;

в контроллере


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

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

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

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

для второго варианта я думаю, что определение внутренней маршрутизации.YML-это неправильно

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

здесь просто удалите MSDHomeBundle из _controller внутри defaults

первый вариант:

имеет ли 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();