Tandis que la solution de déplacement de l' contact_email
de parameters.yml
est facile, comme proposé dans d'autres réponses, qui peuvent facilement nuire à votre fichier de paramètres si vous faites affaire avec de nombreux faisceaux ou si vous faites affaire avec des blocs imbriqués de configuration.
- Tout d'abord, je vais répondre strictement à la question.
- Plus tard, je vais vous donner une approche pour l'obtention de ces configs de services sans jamais passer par l'intermédiaire d'un espace commun en tant que paramètres.
PREMIÈRE APPROCHE: Séparée config bloc, en tant que paramètre
Avec une extension que vous pouvez garder cette facilement "séparés" dans les différents blocs dans l' config.yml
puis injecter que comme un paramètre get à partir du contrôleur.
À l'intérieur de votre classe d'Extension à l'intérieur de l' DependencyInjection
annuaire écrire 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 de sorte que vous pouvez définir
my_nice_project:
contact_email: someone@example.com
Pour être en mesure de traiter que config.yml
à l'intérieur de votre MyNiceBundleExtension
vous aurez également besoin d'un Configuration
de la 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 désirez dans votre question initiale, mais en gardant l' parameters.yml
propre, et le mettre dans l' config.yml
dans des sections séparées:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
DEUXIÈME APPROCHE: Séparée config bloc, l'injection de la config dans un service
Pour les lecteurs à la recherche de quelque chose de semblable, mais aussi pour la config d'un service, il n'est même plus agréable que jamais encombre les "paramètres" de l'espace commun et n'a même pas besoin de l' container
à être passés au service (en passant de l'ensemble du conteneur est une pratique à éviter).
Cette astuce ci-dessus "injecte" dans les paramètres de l'espace de votre config.
Néanmoins, après le chargement de votre définition du service, vous pouvez ajouter une méthode à l'appel comme, par exemple, setConfig()
qui injecte de ce bloc que pour le service.
Par exemple, dans la classe d'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' ] ) );
}
}
Puis dans votre services.yml
vous définissez votre service comme d'habitude, sans aucune variation absolue:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Et puis dans votre SillyManager
classe, il suffit d'ajouter la méthode:
class SillyManager
{
private $contact_email;
public setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Notez que cela fonctionne aussi pour les tableaux à la place de valeurs scalaires! Imaginez que vous configurez un lapin file d'attente et le besoin de l'hôte, utilisateur et mot de passe:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Bien sûr, vous avez besoin de changer votre Arbre, mais vous pouvez le faire:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
et puis dans le service:
class SillyManager
{
private $host;
private $user;
private $password;
public setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Espérons que cette aide!