2012-07-13 13 views
9

symfony 2 Dependency Injection componentを新しいPHP 5.4 traitsで使用する方法を見つけようとしています。Symfony 2:依存性注入と特性

長いストーリーを短くするには(実際は短くはない)、私のプロジェクトでは、すべて独自の固有のコンストラクタを持つViewクラスを切り離しました。各ビューには、特性として定義されているゼロ個以上のビューヘルパーを使用することができます。

trait TranslatorHelper 
{ 
    /** 
    * @var Translator 
    */ 
    protected $translator; 

    /** 
    * @param Translator $translator 
    */ 
    protected function setTranslator(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    /** 
    * @param string $text 
    * @return string 
    */ 
    public function translate($text) 
    { 
     return $this->translator->translate($text); 
    } 
} 

-

class UserEditView extends AbstractView 
{ 
    use TranslatorHelper; 

    public function __construct(User $user, UserEditForm $form) 
    { 
     // ... 
    } 
} 

私はセッターを行い、私のコントローラ、renderView()、方法を持っているしたいのですがビューをレンダリングする前に、Viewクラスで使用されるすべての特性に基づいて注入:

class Controller 
{ 
    public function renderView(View $view) 
    { 
     // Check what traits are used by $view, and inject their dependencies 
     // {...} 


     // Then render the View 
     return $view->render(); 
    } 
} 

012でこれを行う方法上の任意のアイデアコンポーネントですか?

主な問題は明らかに、ビューはDIコンテナによって作成されず、アプリケーションフロー内のどこにでも作成できることです。依存関係を注入する必要があるのはレンダリングされる前です。

最後の注意:私はSymfonyコンポーネントに縛られていません。別のDIコンテナ上のリードも高く評価されます。

+0

DIをAOPで試すことができます:https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rstプロパティと引数のアノテーションによってサービスを自動的に挿入します。 – lisachenko

+0

問題は、ビューヘルパー( 'TranslatorHelper'など)を一般的なものにしたいので、コンテナ内の依存関係のプロジェクト固有のIDを含むべきではないという理想です。 – Benjamin

答えて

4

私はこのようにDIをするために形質が使われることはないと思います。私が似たようなシナリオで行うことは、必要なサービスを直接注入するための特性を実装するビュークラス内で、コンストラクタインジェクションを使用することです(あるいは、セッターがうまくいくかもしれません。

クラスによって実装された特性がアプリケーションが実行される前に静的に定義されていると考えるなら、動的注入を実行するために特質を検査する必要はありません。あなたは実行する前に必要なサービスを知っているだけで、あたかも彼らがいくつかの具体的な方法とインターフェースしているかのように特徴づけると思います。

+0

私は心配していますが、私の懸念は、Viewコンストラクタにヘルパー固有の依存関係がないようにしたいということです(コントローラがViewコンストラクタを明示的に使用して、ヘルパーを心配する)。さらに、私はおそらく何百ものViewクラスを持ち、すべて同じ〜3のビューヘルパーを使用します。だから、私は形質の名前に基づいて注入することができるようにしたいと思います。たとえば、 'TranslatorHelper'特性を使用するすべてのクラスが' translator'コンテナキーが指すトランスレータを使用するように、私の設定で定義したいと思います。 – Benjamin

+3

その場合、DIタギングを使用することができます:タグを定義し、コンパイラが各ヘルパー特性に対して適切なセッター依存関係を持つコンパイラを渡すようにします。高度なDICの使用に関するいくつかの文書(コンパイラのパスやタグなど)は、最近Symfonyのドキュメントでリリースされています。それは自動的に特性に基づいて注入されません(私はそれを行う唯一の方法は、非常に遅い反射を使用すると思う)が、それはかなりきちんとしてきれいです。 –