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();

Инжектирането на контролер/настройка е добър избор, защото не свързвате внедряването на вашия контролер с DI контейнера.

В крайна сметка кой ще използвате зависи от вашите нужди.

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