13

コントローラー内のサービスコンテナーを使用するのではなく、純粋なコンストラクターの依存性注入を介して、コントローラーをサービスに依存させる機会はありますか?

私はこのようにコントローラーを書きたいと思います:

<?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()
    {
        ...
    }

}

return new $controller残念ながら、Symfony ControllerResolverは、ServiceContainerではなく、単純な呼び出し を介してコントローラーの新しいインスタンスを実行します。

4

1 に答える 1

12

絶対に実際にそれが推奨されており、FOSUserなどのほとんどのサードパーティバンドルを見ると、それがまさに彼らが行っていることであることがわかります。

秘訣は、コントローラーをサービスとして定義してから、クラス名の代わりにサービスIDを使用することです。

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

エンティティマネージャーなどの必要なサービスをすべて注入する必要があり、通常はsymfonyの基本クラスを拡張しないことに注意してください。もちろん、完全なコンテナーを注入することもできますが、それは眉をひそめる傾向があります。

于 2012-04-11T12:57:22.480 に答える