Frage Symfony2.3 Bessere Möglichkeit, EntityManager in einen Controller zu bekommen


Ich benutze Symfony2.3 und ich benutze derzeit den EntityManager wie in der Abbildung gezeigt __bauen()

Was ist ein besserer Ansatz mit EntityManager aus __bauen() oder in jeder Methode verwenden? wie gezeigt in 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();
    }

5
2018-03-03 18:36


Ursprung


Antworten:


Wenn du Muss habe den EntityManager verfügbar in Ihrem Konstruktor, ist eine gute Möglichkeit, es in den Konstruktor zu injizieren.

Um dies zu tun, müssen Sie Ihre definieren Controller als Dienst.

# 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 ] 

Jetzt müssen Sie nur Ihren Controller ändern:

use Doctrine\ORM\EntityManager;

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

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

Wenn Sie das nicht benötigen Entity Manager Im Konstruktor können Sie ihn einfach mit dem Abhängigkeitsinjektionscontainer von einer beliebigen Methode in Ihrem Controller abrufen:

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

ODER

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

Controller / Setter-Injektion ist eine gute Wahl, da Sie Ihre Controller-Implementierung nicht mit dem DI-Container verbinden. 

Am Ende ist derjenige, den Sie verwenden, Ihren Bedürfnissen angepasst.


9
2018-03-03 19:01



In Symfony 2.3 glaube ich, dass eine Verbindung zum Doktrin-Entity-Manager in die Controller-Klasse integriert ist.

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

Es empfiehlt sich, diesen Anruf in den Controllern zu tätigen, wenn Sie ihn benötigen. Wenn es einfach Bequemlichkeit ist, könnten Sie eine Controller-Klasse ableiten und etwas wie getEm () hinzufügen, wenn Sie das zu abstoßend finden.

Oft ist Ihre eigene Controller-Klasse eine gute Idee, um Sicherheitseinschränkungen einzubauen und Ihren Code DRY zu machen.


0
2018-03-03 18:50



Können wir einen Konstruktor in der Controller-Klasse definieren? Die Doktrin ist ein Dienst. Macht es irgendeinen Unterschied, die Lehre in den Konstruktor zu bekommen oder dorthin zu gelangen, wo man es will? In beiden Fällen erhalten Sie den gleichen Service. Warum willst du die em injizieren, die bereits injiziert wurde?


0
2018-03-03 19:15