Symfony2.3 Лучший способ получить EntityManager внутри контроллера

Я использую Symfony2.3 и в настоящее время использую EntityManager, как показано внутри __construct()

Какой подход лучше использовать, используя EntityManager из __construct() или используя внутри каждого метода? как показано в public indexAction()

/**
 * QuazBar controller.
 *
 */
class QuazBarController extends Controller
{

    public function __construct()
    {
        $this->em = $GLOBALS['kernel']->getContainer()->get('doctrine')->getManager();
    }

    /**
     * Lists all QuazBar entities.
     *
     */
    public function indexAction(Request $request)
    {
        $session    = $request->getSession();
        $pagina     = $request->query->get('page', 1);
        $em         = $this->getDoctrine()->getManager();
    }

person NBPalomino    schedule 03.03.2014    source источник


Ответы (3)


Если вы должны иметь EntityManager в своем конструкторе, хороший способ получить его — внедрить его в конструктор.

Для этого вы должны определить свой контроллер как службу.

# src/Acme/DemoBundle/Resources/config/services.yml
parameters:
    # ...
    acme.controller.quazbar.class: Acme\DemoBundle\Controller\QuazBarController

services:
    acme.quazbar.controller:
        class: "%acme.controller.quazbar.class%"
    # inject doctrine to the constructor as an argument
    arguments: [ @doctrine.orm.entity_manager ] 

Теперь все, что вам нужно сделать, это изменить свой контроллер:

use Doctrine\ORM\EntityManager;

/**
 * QuazBar controller.
 *
 */
class QuazBarController extends Controller
{

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    // ...
}

Если вам не требуется Entity Manager в конструкторе, вы можете просто получить его с помощью контейнера внедрения зависимостей из любого метода в вашем контроллере:

$this->getDoctrine()->getManager();

OR

$this->container->get('doctrine')->getManager();

Внедрение контроллера/установщика — хороший выбор, поскольку вы не связываете реализацию контроллера с контейнером внедрения зависимостей.

В конце концов, какой из них вы используете, зависит от ваших потребностей.

person Onema    schedule 03.03.2014
comment
Спасибо, но если у меня много контроллеров (50~), не стоит делать все Контроллер как услугу, верно? - person NBPalomino; 03.03.2014
comment
Как я уже сказал: какой из них вы используете, зависит от ваших потребностей. Не зная больше о вашем конкретном проекте, трудно посоветовать, как или что еще вы можете сделать. Вам может понадобиться базовый класс или использовать шаблон проектирования. Я бы просто был последователен в коде, поэтому выберите один и придерживайтесь его :). Обратите внимание, что для меня то, как вы получаете EM в конструкторе, вызывает некоторые красные флажки: использование переменной $GLOBALS является одним, а цепочка методов между несколькими объектами - другим. - person Onema; 03.03.2014

Я считаю, что в symfony 2.3 соединение с менеджером сущностей доктрины встроено в класс контроллера.

$em = $this->getDoctrine()->getManager();

Лучше всего делать этот вызов в контроллерах, когда он вам нужен. Если это просто для удобства, вы можете получить класс контроллера и добавить что-то вроде getEm(), если вы находите это слишком одиозным.

Часто собственный класс контроллера является хорошей идеей для добавления ограничений безопасности и создания более СУХОГО кода.

person gview    schedule 03.03.2014

Можем ли мы определить конструктор в классе контроллера? Учение — это служение. Имеет ли значение получение доктрины в конструкторе или получение ее из di. В обоих случаях вы получаете одинаковую услугу. Почему вы хотите ввести em, который уже введен.

person guy_fawkes    schedule 03.03.2014