Si bien la solución de mover el contact_emailto parameters.ymles fácil, como se propone en otras respuestas, eso puede saturar fácilmente su archivo de parámetros si maneja muchos paquetes o si maneja bloques de configuración anidados.
- Primero, responderé estrictamente la pregunta.
- Más adelante, daré un enfoque para obtener esas configuraciones de los servicios sin pasar nunca por un espacio común como parámetros.
PRIMER ENFOQUE: Bloque de configuración separado, obteniéndolo como parámetro
Con una extensión ( más sobre extensiones aquí ) puede mantener esto fácilmente "separado" en diferentes bloques en el config.ymly luego inyectarlo como un parámetro que se puede obtener del controlador.
Dentro de su clase de Extensión dentro del DependencyInjectiondirectorio escriba esto:
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
}
Luego, en su config.yml, config_dev.yml y así puede configurar
my_nice_project:
contact_email: someone@example.com
Para poder procesar eso config.ymldentro de tu MyNiceBundleExtensiontambién necesitarás una Configurationclase en el mismo espacio de nombres:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Luego puede obtener la configuración de su controlador, como lo deseaba en su pregunta original, pero manteniendo la parameters.ymllimpieza y configurándola config.ymlen secciones separadas:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
SEGUNDO ENFOQUE: Bloque de configuración separado, inyectando la configuración en un servicio
Para los lectores que buscan algo similar, pero para obtener la configuración de un servicio, existe una forma aún mejor que nunca abarrota el espacio común de "parámetros" e incluso no necesita containerque se pase al servicio (pasar el contenedor completo es práctica para evitar).
Este truco anterior todavía "se inyecta" en el espacio de parámetros de su configuración.
Sin embargo, después de cargar su definición del servicio, puede agregar una llamada a un método como, por ejemplo, setConfig()que inyecta ese bloque solo al servicio.
Por ejemplo, en la clase de extensión:
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' ] ) );
}
}
Luego, en su services.yml, defina su servicio como de costumbre, sin ningún cambio absoluto:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Y luego en tu SillyManagerclase, solo agrega el método:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Tenga en cuenta que esto también funciona para matrices en lugar de valores escalares. Imagine que configura una cola de conejo y necesita host, usuario y contraseña:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Por supuesto, debe cambiar su árbol, pero luego puede hacer:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
y luego en el servicio hacer:
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 esto ayude!