Alors que la solution de déplacer le contact_email
vers parameters.yml
est simple, comme proposé dans d'autres réponses, cela peut facilement encombrer votre fichier de paramètres si vous traitez avec de nombreux bundles ou si vous traitez des blocs de configuration imbriqués.
- Tout d'abord, je vais répondre strictement à la question.
- Plus tard, je donnerai une approche pour obtenir ces configurations à partir de services sans jamais passer par un espace commun en tant que paramètres.
PREMIÈRE APPROCHE: bloc de configuration séparé, l'obtenir comme paramètre
Avec une extension ( plus d'informations sur les extensions ici ), vous pouvez garder cela facilement "séparé" en différents blocs dans le config.yml
, puis l'injecter en tant que paramètre récupérable par le contrôleur.
Dans votre classe Extension dans le DependencyInjection
répertoire, écrivez ceci:
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
}
Puis dans votre config.yml, config_dev.yml et ainsi vous pouvez définir
my_nice_project:
contact_email: someone@example.com
Pour pouvoir traiter cela config.yml
dans votre, MyNiceBundleExtension
vous aurez également besoin d'une Configuration
classe dans le même espace de noms:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Ensuite, vous pouvez obtenir la configuration de votre contrôleur, comme vous le souhaitez dans votre question d'origine, mais en gardant la parameters.yml
netteté et en la définissant dans les config.yml
sections séparées:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
DEUXIÈME APPROCHE: bloc de configuration séparé, injectant la configuration dans un service
Pour les lecteurs à la recherche de quelque chose de similaire mais pour obtenir la configuration d'un service, il existe même un moyen plus agréable qui n'encombre jamais l'espace commun des "paramètres" et n'a même pas besoin de container
d'être transmis au service (passer le conteneur entier est pratique pour éviter).
Cette astuce ci-dessus "injecte" encore dans l'espace des paramètres votre config.
Néanmoins, après avoir chargé votre définition du service, vous pouvez ajouter un appel de méthode comme par exemple setConfig()
qui injecte ce bloc uniquement dans le service.
Par exemple, dans la 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' ] ) );
}
}
Ensuite, dans votre services.yml
vous définissez votre service comme d'habitude, sans aucun changement absolu:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Et puis dans votre SillyManager
classe, ajoutez simplement la méthode:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Notez que cela fonctionne également pour les tableaux au lieu des valeurs scalaires! Imaginez que vous configurez une file d'attente de lapin et que vous avez besoin d'un hôte, d'un utilisateur et d'un mot de passe:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Bien sûr, vous devez changer votre arbre, mais vous pouvez ensuite faire:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
puis dans le service faire:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
J'espère que cela t'aides!