당신은 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하는 방법이있다 심포니에서
너무 좋아요,하지만 커요. 누군가 구현을 필요로한다면 기쁜 마음으로 듣겠습니다.
서비스 이외의 것을 전달하고 싶다면 어떻게됩니까? –
@Ben_hawk 당신은 서비스, 매개 변수 및 일반 값을 전달할 수 있습니다 :'arguments : [@service_id, "plain_value", % parameter %]' – phpsherpa