Embora a solução de mover contact_email
para to parameters.yml
seja fácil, conforme proposto em outras respostas, isso pode facilmente confundir seu arquivo de parâmetros se você lidar com muitos pacotes configuráveis ou se você lidar com blocos de configuração aninhados.
- Primeiro, eu responderei estritamente a pergunta.
- Mais tarde, darei uma abordagem para obter essas configurações de serviços sem nunca passar por um espaço comum como parâmetros.
PRIMEIRA ABORDAGEM: Bloco de configuração separado, obtendo-o como parâmetro
Com uma extensão ( mais sobre extensões aqui ), você pode mantê-la facilmente "separada" em diferentes blocos noconfig.yml
e, em seguida, injetar isso como um parâmetro que pode ser obtido do controlador.
Dentro da classe Extension dentro do DependencyInjection
diretório, escreva isto:
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
}
Em seguida, no seu config.yml, config_dev.yml e assim você pode definir
my_nice_project:
contact_email: someone@example.com
Para poder processar isso config.yml
dentro do seu, MyNiceBundleExtension
você também precisará de uma Configuration
classe no mesmo espaço para nome:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Em seguida, você pode obter a configuração do seu controlador, conforme desejado na sua pergunta original, mas mantendo-a parameters.yml
limpa e configurando-a config.yml
nas seções separadas:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
SEGUNDA ABORDAGEM: Bloco de configuração separado, injetando a configuração em um serviço
Para os leitores que procuram algo semelhante, mas para obter a configuração de um serviço, existe uma maneira ainda melhor que nunca atrapalha o espaço comum "paramaters" e nem precisa do container
ser passado para o serviço (passar o contêiner inteiro é prática evitar).
Este truque acima ainda "injeta" no espaço de parâmetros sua configuração.
No entanto, depois de carregar sua definição do serviço, você pode adicionar uma chamada de método, como por exemplo setConfig()
que injeta esse bloco apenas no serviço.
Por exemplo, na classe 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' ] ) );
}
}
Então, no seu, services.yml
você define seu serviço como de costume, sem nenhuma alteração absoluta:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
E então na sua SillyManager
turma, basta adicionar o método:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Observe que isso também funciona para matrizes em vez de valores escalares! Imagine que você configure uma fila de coelhos e precisa de host, usuário e senha:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Claro que você precisa mudar sua Árvore, mas pode fazer:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
e depois no serviço faça:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Espero que isto ajude!