Mentre la soluzione per spostare il contact_email
to parameters.yml
è facile, come proposto in altre risposte, ciò può facilmente ingombrare il tuo file di parametri se gestisci molti bundle o se gestisci blocchi di configurazione nidificati.
- Innanzitutto, risponderò rigorosamente alla domanda.
- Successivamente, fornirò un approccio per ottenere quelle configurazioni dai servizi senza mai passare attraverso uno spazio comune come parametri.
PRIMO APPROCCIO: blocco di configurazione separato, ottenendolo come parametro
Con un'estensione ( ulteriori informazioni sulle estensioni qui ) è possibile mantenerlo facilmente "separato" in diversi blocchi nel config.yml
e quindi iniettarlo come parametro ottenibile dal controller.
All'interno della tua classe Extension all'interno della DependencyInjection
directory scrivi questo:
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
}
Quindi nel tuo config.yml, config_dev.yml e così puoi impostare
my_nice_project:
contact_email: someone@example.com
Per essere in grado di elaborare ciò config.yml
all'interno del tuo MyNiceBundleExtension
, avrai anche bisogno di una Configuration
classe nello stesso spazio dei nomi:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Quindi è possibile ottenere la configurazione dal controller, come desiderato nella domanda originale, ma mantenendo parameters.yml
pulito e impostandolo config.yml
nelle sezioni separate:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
SECONDO APPROCCIO: blocco di configurazione separato, iniettando la configurazione in un servizio
Per i lettori alla ricerca di qualcosa di simile ma per ottenere la configurazione da un servizio, esiste anche un modo migliore che non ingombra mai lo spazio comune "paramaters" e non ha nemmeno bisogno container
di essere passato al servizio (passare l'intero contenitore è pratica evitare).
Questo trucco sopra "inietta" ancora nello spazio dei parametri della tua configurazione.
Tuttavia, dopo aver caricato la definizione del servizio, è possibile aggiungere una chiamata di metodo come ad esempio setConfig()
che inietta quel blocco solo al servizio.
Ad esempio, nella 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' ] ) );
}
}
Quindi nel tuo services.yml
definisci il tuo servizio come al solito, senza alcun cambiamento assoluto:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
E poi nella tua SillyManager
classe, aggiungi semplicemente il metodo:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Si noti che questo funziona anche per le matrici anziché per i valori scalari! Immagina di configurare una coda di coniglio e di avere bisogno di host, utente e password:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Ovviamente devi cambiare il tuo albero, ma poi puoi fare:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
e poi nel servizio fai:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Spero che questo ti aiuti!