13

Gibt es eine Chance Controller auf ihre Leistungen abhängig machen nicht in ihnen der Service-Container über Verwendung, sondern durch reine Konstruktor Dependency Injection?Symfony 2: Dependency Injection (DI) von Controllern

würde Ich mag Controller auf diese Weise schreiben:

<?php 

class ArticleController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    private $articleFacade; 
    private $articleRepository; 

    public function __construct(ArticleFacade $articleFacade, ArticleRepository $articleRepository) 
    { 
     $this->articleFacade = $articleFacade; 
     $this->articleRepository = $articleRepository; 
    } 

    public function indexAction() 
    { 
     ... 
    } 

} 

Unfortunatelly als ich Symfony ControllerResolver neue Instanzen Controller funktioniert nicht sehen können, über Servicecontainer, sondern über einfache return new $controller Anruf.

Antwort

12

Absolut in der Tat ist es empfehlenswert, und wenn man sich die meisten 3rd-Party-Pakete aussehen wie FOSUser können Sie sehen, dass das ist genau das, was sie tun.

Der Trick ist, Ihre Controller als Dienste zu definieren und dann den Dienst-ID-Namen anstelle der Klasse verwenden.

http://symfony.com/doc/current/cookbook/controller/service.html

Beachten Sie, dass Sie alle Ihre benötigten Dienste wie Entity-Manager injizieren müssen, und Sie werden nicht in der Regel die symfony Basisklasse erweitern. Natürlich könnte man den kompletten Behälter injizieren, aber das ist eher verpönt.

+0

Vielen Dank für Ihre Antwort. –

+1

Werfen Sie einen Blick auf meine [AbstractControllerBundle] (https://github.com/elnur/ElnurAbstractControllerBundle). Es soll Ihnen einen [Parent Service] (http://symfony.com/doc/current/cookbook/service_container/parentservices.html) zur Verfügung stellen, um die Verwendung von Controllern als Dienste zu vereinfachen. –

+9

Es sieht nicht mir wie FOSUser dies tut? Verpasse ich den Punkt? Václavs Frage war, sie über die Konstruktormethode zu injizieren, während FOSUser $ this-> container-> get ('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve