2011-12-24 10 views

答えて

24

カスタムクラスをサービスとして定義し、依存関係を注入します。

例:

// services.yml 
services: 
    my.custom.service.id: 
     class: My\Custom\Class 
     arguments: 
     - @service.name 
     - @doctrine.orm.entity_manager 

カスタムクラスのコンストラクタは、引数として、これらのサービスになるだろう。

公式ドキュメントのサービスコンテナを必ずお読みください。それはすべてこのことを非常に詳しく説明しています。

-3

OK私は@Arms答えは可能な解決策ですが、私はControllerにソースを見ることで見つけ、私はあなたがContainerAwareと正しい軌道に乗っていたContainerAware

+2

は、あなたが 'ContainerAware'を拡張する場合は、手動でコンテナオブジェクトを設定する必要があることに注意してください。コンテナにアクセスできないカスタムクラスをインスタンス化している場合、これはできません。 –

+3

容器全体を注入するのは悪い考えです。あなたのサービスに必要な各サービスを明示的に注入します。 –

7

を延長する可能性があるとします。

$this->get('id')は、実際には$this->container->get('id')へのショートカットです。そして、あなたのクラスにコンテナを取得することはContainerAwareInterfaceを実装するのと同じくらい簡単です - あなたのクラスにこのスニペットを置く:

public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null) 
{ 
    $this->container = $container; 
} 
+5

誰にでも-1を置く:私は本当になぜ私の答えが間違っていると答え、正解は何だと思いますか?質問は基本的には「サービスコンテナをカスタムクラスに挿入する方法は?」ということに留意してください。 – Inoryy

+3

私はdownvoted人ではありませんが、元の質問は、(悪い習慣と考えられている)サービスコンテナを注入する方法ではなく、カスタムクラスのサービスにアクセスする方法でした。 –

+5

彼はカスタムどのように特定のサービスを注入するかではなく、彼はコントローラからの例を与えて、行動を再現する方法を探していました。事実上状況が悪いので、完全に正しい答えを下降させることは非常に間違っています。なぜなら、我々は完全なユースケースを決めていないからです。だから私はそれが-1の背後にある理由ではないことを本当に願っています。 – Inoryy

-2

これを行うためのベストプラクティスではありませんが、それが動作するように、容器を渡すことができます。カスタムクラスがサービスになるように設定されていないなら、あなたはグローバル変数$カーネルを使用してサービスコンテナにアクセスすることができます。

class Helper { 

    private $container; 

    /** 
    * Constructor assigns service container to private container. 
    */ 
    public function __construct() { 

     global $kernel; 
     $this->container = $kernel->getContainer(); 

    } 

    function doSOmething() { 
     $someService = $this->container->get('service.name'); 
     // do something with someService ... 
    } 

} 
+0

omg、symfonyのグローバルを使用してもうまく見えません – Eddie

+0

これは有効な解決策ですが、ベストプラクティスではありませんが、まだ – DevWL

+0

"それは機能しています"では不十分です – Eddie

関連する問題