2013-06-29 3 views
1

서비스의 매개 변수를 어떻게 지정합니까? Symfony 문서를 따라 내 번들 내 config.yml 파일에 추가하여 내 서비스를 만들었습니다.symfony 서비스 매개 변수

system_info_memory: 
     class:  "%system_info.memory.class%" 
     arguments: ['enviroment'] 

이 호출하여 내 컨트롤러에서 완벽하게 작동합니다 :

실제로 동적으로 내 서비스에 대한 인수를 설정하는 방법에 대해 아무것도 볼 수 없었다 그러나
$service = $this->get('system_info_memory'); 

은, 위의 단지 정적 문자열 '환경'통과 클래스 생성자에 넣습니다. 그러나 나는 값으로 전달할 것이다 :

$this->container->get('kernel')->getEnvironment() 

컨테이너에서 클래스의 인스턴스를 가져 오기 전에.

아무도 도와 줄 수 있습니까? 의존성 주입의 두 가지 유형이 주로 있습니다

services: 
    system_info_memory: 
     class:  %system_info.memory.class% 
     arguments: [ %kernel.environment% ] 

답변

0

당신은 kernel.environment 매개 변수를 삽입 할 수 있습니다. 심포니 (Symfony)에서도 우리는 내가 여기에서 모두 설명 할 수있는 특별한 방법을 가지고 있습니다.

1 생성자 주입은

이 방법은 심포니는 설정 파일에 서비스 매개 변수를 정의하여 당신을 위해 그렇게 할 것입니다 서비스의 생성자에 매개 변수를 제공하기 위해 클라이언트가 필요합니다.

saman.search: 
    class: Saman\SearchBundle\Services\SearchService 
    arguments: 
     - @translator 
     - @doctrine.orm.default_entity_manager 
     - %search_service_parameters% 

그리고 당신의 서비스 클래스에

당신은이 :

<?php 

namespace Library\Services; 

use Doctrine\ORM\EntityManager; 
use Symfony\Bundle\FrameworkBundle\Translation\Translator; 

class SearchService 
{ 
    /** 
    * Translator services 
    * 
    * @var TranslatorService $translatorService 
    */ 
    protected $translatorService; 

    /** 
    * 
    * @var EntityManager $em 
    */ 
    protected $em; 

    /** 
    * Client side parameters 
    * 
    * @var array 
    */ 
    protected $parameters; 

    public function __construct(
     TranslatorService $translatorService, 
     EntityManager $em, 
     array $parameters = array() 
     ) 
    { 
     $this->translatorService = $translatorService; 
     $this->em = $em; 
     $this->parameters = $parameters; 
    } 

    public function doSomething() 
    { 
     return $this->translatorService->trans('app.text.hello'); 
    } 
} 
?> 

2 세터 주입

이 방법은 각각의 종속에 대한 세터 방법을 제공하는 서비스를 필요로한다. 그리고 서비스를 사용하려면 종속성을 동적으로 설정하십시오. 이렇게하면 언제든지 종속성 설정을 자유롭게 할 수 있습니다.

saman.search: 
    class: Saman\SearchBundle\Services\SearchService 
    arguments: 
     - @translator 
     - @doctrine.orm.default_entity_manager 
     - %search_service_parameters% 

saman.a: 
    class: Saman\SearchBundle\Services\A 
    arguments: ~ 

그리고 당신의 서비스에

당신은 :

<?php 

namespace Library\Services; 

use Doctrine\ORM\EntityManager; 
use Symfony\Bundle\FrameworkBundle\Translation\Translator; 
use Library\Services\A; 

class SearchService 
{ 
    /** 
    * Translator services 
    * 
    * @var TranslatorService $translatorService 
    */ 
    protected $translatorService; 

    /** 
    * 
    * @var EntityManager $em 
    */ 
    protected $em; 

    /** 
    * Service A 
    * @var A $a 
    */ 
    protected $a; 

    /** 
    * Client side parameters 
    * 
    * @var array 
    */ 
    protected $parameters; 

    public function __construct(
     TranslatorService $translatorService, 
     EntityManager $em, 
     array $parameters = array() 
     ) 
    { 
     $this->translatorService = $translatorService; 
     $this->em = $em; 
     $this->parameters = $parameters; 
    } 

    public function setServiceA(A $a) 
    { 
     $this->a = $a; 

     return $this; 
    } 

    public function doSomethingNeedServiceA() 
    { 
     return $this->getServiceA()->doSomethingInA(); 
    } 

    private function getServiceA() 
    { 
     if (null === $this->a) { 
      throw new \LogicException("You should set service A first"); 
     } 

     return $this->a; 
    } 
} 
?> 

이 또한 사용하는 인터페이스

<?php 

namespace Library\Services; 

use Doctrine\ORM\EntityManager; 
use Symfony\Bundle\FrameworkBundle\Translation\Translator; 
use Library\Interfaces\A; 

class SearchService 
{ 
    /** 
    * Translator services 
    * 
    * @var TranslatorService $translatorService 
    */ 
    protected $translatorService; 

    /** 
    * 
    * @var EntityManager $em 
    */ 
    protected $em; 

    /** 
    * Interfaces A 
    * @var A $a 
    */ 
    protected $a; 

    /** 
    * Client side parameters 
    * 
    * @var array 
    */ 
    protected $parameters; 

    public function __construct(
     TranslatorService $translatorService, 
     EntityManager $em, 
     array $parameters = array() 
     ) 
    { 
     $this->translatorService = $translatorService; 
     $this->em = $em; 
     $this->parameters = $parameters; 
    } 

    public function setServiceA(A $a) 
    { 
     $this->a = $a; 

     return $this; 
    } 

    public function doSomethingNeedServiceA() 
    { 
     return $this->getServiceA()->doSomethingInA(); 
    } 

    private function getServiceA() 
    { 
     if (null === $this->a) { 
      throw new \LogicException("You should set a service that implement A interfaces"); 
     } 

     return $this->a; 
    } 
} 
?> 

그리고

<?php 

namespace Library\Interfaces; 

interface A 
{ 
    public function doSomethingInA(); 
} 
?> 

그럼 당신이 원하는 때 인터페이스에 의해 개선 될 수있다 당신이이 서비스를 사용하는 방법 자민련 할

$aService = $this->get('saman.a'); 
$searchService = $this->get('saman.search'); 

$searchService->setServiceA($aService) 
    ->doSomethingNeedServiceA(); 

3 태그 서비스

나는이 방법을 구현하고있는 구성 태그 Working with Tagged Services

을 다른 서비스에 서비스를 등록 ussing하는 방법이있다 심포니에서

너무 좋아요,하지만 커요. 누군가 구현을 필요로한다면 기쁜 마음으로 듣겠습니다.

+0

서비스 이외의 것을 전달하고 싶다면 어떻게됩니까? –

+0

@Ben_hawk 당신은 서비스, 매개 변수 및 일반 값을 전달할 수 있습니다 :'arguments : [@service_id, "plain_value", % parameter %]' – phpsherpa

1

:

관련 문제