2012-03-02 7 views
0

コントローラの外部からサービス(セッションなど)を取得しようとしています。Symfony2のサービス

この正しい方法を説明してください。

答えて

3

多くの異なる方法があり、すべてが賛否両論あります。

まず、すべてのサービスは何らかの種類のオブジェクトなので、いつでも問題のオブジェクトを自分で作成できます。あなたは多くの参考文献を扱わなければならないかもしれませんが、可能です。これはDependency Injectionのアイデアを損なうので、あなたがすべきことではありません!

第二の方法は、あなたのクラスにサービスを注入です:

class MyClass{ 

    public function __construct($session){ 
     // ... 
    } 
} 

class MyContainer extends Controller{ 

    public function SomeKindOfAction(){ 
     $myClass = new MyClass($this->get('session')); 
    } 
} 

あなただけのコントローラ内のクラスを使用する場合、これはOKかもしれません。 MyClassのようなネストされたリレーションがある場合は、セッションが必要な別のクラスを作成します。複雑な問題と同様に、密結合(回避する)を実行する可能性があります。

あなた自身のサービスを作成し、そこに必要なものを注入するのが最善の方法です。そこには多くの文書がありますので、上記のMyClassを使用して簡単な例を示します。

services.yml: 

services: 
    my.myClass: 
     class: /Acme/DefaultBundle/MyStuff/MyClass 
     arguments: ["@session"] 

今、あなたのクラスは、サービスとしては(誰が、それが簡単ということだと思うだろう!)、あなたはあなたのコントローラ内で使用することができます:

class MyContainer extends Controller{ 

    public function SomeKindOfAction(){ 
     $myClass = $this->get('my.myClass'); 
    } 
} 

今、あなたは、コンストラクタや方法を考える必要はありませんあなたのオブジェクトを取得するために、DIコンテナがそれを行います。詳細はhereをご覧ください。

+0

ありがとう – falinsky

関連する問題