다른 답변에서 제안한 것처럼 contact_email
to 를 이동하는 방법 parameters.yml
은 쉽지만 많은 번들을 처리하거나 중첩 된 구성 블록을 처리하는 경우 매개 변수 파일을 쉽게 어수선 할 수 있습니다.
- 먼저 엄격하게 질문에 대답하겠습니다.
- 나중에 공통 공간을 매개 변수로 사용하지 않고 서비스에서 해당 구성을 가져 오는 방법을 제공합니다.
첫 번째 접근 방식 : 분리 된 구성 블록, 매개 변수로 가져 오기
확장 기능 ( 여기서 확장 기능에 대한 자세한 내용 )을 사용하면이 블록을 다른 블록으로 쉽게 "분리" config.yml
한 다음 컨트롤러에서 gettable 매개 변수로 삽입 할 수 있습니다.
DependencyInjection
디렉토리 안의 Extension 클래스 안에 다음을 작성하십시오.
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
// The next 2 lines are pretty common to all Extension templates.
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// This is the KEY TO YOUR ANSWER
$container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] );
// Other stuff like loading services.yml
}
그런 다음 config.yml에서 config_dev.yml을 설정하면
my_nice_project:
contact_email: someone@example.com
config.yml
내부 에서 처리하려면 동일한 네임 스페이스 MyNiceBundleExtension
의 Configuration
클래스가 필요 합니다.
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
그런 다음 원래 질문에서 원하는대로 컨트롤러에서 구성을 가져올 수 있지만 parameters.yml
깨끗하게 유지하고 config.yml
별도의 섹션에 설정하십시오 .
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
두 번째 접근법 : 구성을 서비스에 주입하는 분리 된 구성 블록
비슷한 것을 찾고 있지만 서비스에서 구성을 얻는 독자에게는 "매개 변수"공통 공간을 어지럽히 지 않고 container
서비스로 전달할 필요가없는 더 좋은 방법이 있습니다 (전체 컨테이너를 전달하는 것은 실습입니다. 기피).
위의 트릭은 여전히 설정 공간의 매개 변수 공간에 "주입"합니다.
그럼에도 불구하고 서비스 정의를로드 한 후 서비스 setConfig()
에만 해당 블록을 삽입하는 것과 같은 메소드 호출을 추가 할 수 있습니다 .
예를 들어, Extension 클래스에서
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// Do not add a paramater now, just continue reading the services.
$loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
$loader->load( 'services.yml' );
// Once the services definition are read, get your service and add a method call to setConfig()
$sillyServiceDefintion = $container->getDefinition( 'my.niceproject.sillymanager' );
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'contact_email' ] ) );
}
}
그런 다음 services.yml
절대 변경없이 평소와 같이 서비스를 정의하십시오.
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
그런 다음 SillyManager
수업에서 메소드를 추가하십시오.
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
이것은 스칼라 값 대신 배열에도 적용됩니다! 토끼 대기열을 구성하고 호스트, 사용자 및 비밀번호가 필요하다고 상상해보십시오.
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
물론 트리를 변경해야하지만 다음을 수행 할 수 있습니다.
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
그리고 서비스에서 :
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
도움이 되었기를 바랍니다!