Si bien la solución de mover el contact_email
to parameters.yml
es 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.yml
y luego inyectarlo como un parámetro que se puede obtener del controlador.
Dentro de su clase de Extensión dentro del DependencyInjection
directorio 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.yml
dentro de tu MyNiceBundleExtension
también necesitarás una Configuration
clase 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.yml
limpieza y configurándola config.yml
en 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 container
que 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 SillyManager
clase, 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!