2017-11-03 8 views
1

私はSymfony2を使用しており、Symfony2/3依存性注入コンテナ内のサービス/ファクトリとして機能を使用したいと考えています。これは可能ですか?デフォルトでサポートされていない場合、これを許可するためにDICを拡張できますか?Symfony2/3依存性注入コンテナのサービスとしての機能の使用

2つのシナリオ:

# example service definition 
services: 
    service_a: 
     function: MyNamespace\createGrobulator 
     arguments: 
      - "@logger" 
      - "@doctrine.orm.entity_manager" 

    service_b: 
     function: MyNamespace\createTitulator 
     arguments: 
      - "@service_a" 
:オブジェクト

例の設定を作成する "工場" 機能を使用して機能

  • を作成する "工場" 機能を使用して

    • と実装例:

      function createGrobulator(LoggerInterface $logger, $em) 
      { 
          // do something here 
          return function ($x) use ($logger, $em) { 
           return something; 
          }; 
      } 
      
      function createTitulator($serviceA) { 
          return new ObjectOfSomeType($serviceA); 
      } 
      

      __invoke()メソッドを使用してクラスをシミュレートすることは可能ですが、OOPへの不必要な遵守のように非常に冗長であり、PSRの推奨事項を使用すると、時々)非常に小さい機能。あなたのservices.yml

      services: 
          service_a: 
           function: MyNamespace\createGrobulator 
           arguments: 
            - "@logger" 
            - "@doctrine.orm.entity_manager" 
           calls: 
            - [setMyService, ['@my.service']] 
      

      とあなたのサービスで中

  • 答えて

    1

    私が正しくあなたを理解している場合、あなたは以下のようにcallsを使用することによってそれを行うことができます

    protected $myService; 
    
    public function setMyService(MyService $myService) { 
        $this->myService = $myService; 
    } 
    
    public function getMyService() { 
        return $this->myService; 
    } 
    
    function createTitulator() { 
        return new ObjectOfSomeType($this->getMyService()); 
    } 
    

    私はちょうどあなたのために例を挙げました。詳細はService Method Calls and Setter Injection

    +2

    彼らは完全にクラスの使用を避けたいと確信しています。 – Cerad

    +0

    可能であれば@Ceradはい – contrebis

    関連する問題