2011-01-27 15 views
179

Ho aggiunto un ambiente al mio file config.yml come tale:Come leggere le impostazioni di configurazione da Symfony2 config.yml?

app.config: 
    contact_email: [email protected] 
    ... 

Per la vita di me, non riesco a capire come leggere in una variabile. Ho provato qualcosa di simile in uno dei miei controllori:

$recipient = 
$this->container->getParameter('contact_email'); 

Ma ottengo un errore che dice:

Il parametro "contact_email" deve essere definito.

Ho cancellato la cache, ho anche cercato ovunque nella documentazione del sito ricaricata Symfony2, ma non riesco a scoprire come farlo.

Probabilmente troppo stanco per capirlo ora. Qualcuno può aiutare con questo?

risposta

190

Piuttosto che definire contact_email all'interno app.config, definirlo in una voce parameters:

parameters: 
    contact_email: [email protected] 

Si dovrebbe trovare la chiamata si stanno facendo nel vostro controller ora funziona.

+4

Come funzionerebbe con gli ambienti Dev/Prod? Quindi per i test voglio che le e-mail vengano inviate a una e-mail di prova e la produzione riceverà un'altra email –

+2

@Phill: Se si utilizza lo swiftmailer standard in symfony2, è possibile utilizzare la seguente impostazione nel file config_dev.yml: 'swiftmailer: delivery_address: dev @ example.com 'Puoi trovare maggiori informazioni nel [ricettario di Symfony2] (http://symfony.com/doc/current/cookbook/email/dev_environment.html) – Pierre

+4

Devo inserire il container class ovunque (controller, entità, classe) quando uso questa dichiarazione ** $ this-> container-> getParameter ('contact_email'); **? o c'è un modo più semplice per farlo senza iniettare classe contenitore? – webblover

33

devo aggiungere alla risposta di Douglas, è possibile accedere alla configurazione globale, ma symfony traduce alcuni parametri, ad esempio:

# config.yml 
... 
framework: 
    session: 
     domain: 'localhost' 
... 

sono

$this->container->parameters['session.storage.options']['domain']; 

È possibile utilizzare var_dump per cerca una chiave o un valore specificato.

+0

chiaro e semplice! grazie – Cowwando

17

Per poter esporre alcuni parametri di configurazione per il pacchetto è necessario consultare la documentazione per farlo. E 'abbastanza facile da fare :)

ecco il link: How to expose a Semantic Configuration for a Bundle

+0

Onestamente, questa domanda è stata fatta più di 2 anni fa, a quel tempo, l'articolo di cui sopra non esisteva. –

+10

Sono d'accordo con questa affermazione. Ho impostato la risposta nel caso qualcuno oggi aprisse questo articolo. Grazie per la valutazione negativa - hai reso la mia giornata. –

+0

Le mie scuse, ora che ci penso, il mio downvote non è stato gradito. Apprezzo il tuo contributo, ho provato a upvotare ma SO non lo permette più. Il collegamento è molto utile, e sono sicuro che altre persone ne trarranno beneficio! Forse l'amministratore può aiutare a cambiare il mio downvote ??? –

154

Mentre la soluzione di spostare il contact_email-parameters.yml è facile, come proposto in altre risposte, che può facilmente ingombrare i parametri di file se avete a che fare con molte pacchetti o se gestisci blocchi di configurazione annidati.

  • In primo luogo, risponderò rigorosamente alla domanda.
  • Successivamente, darò un approccio per ottenere tali configurazioni dai servizi senza passare mai attraverso uno spazio comune come parametri.

primo approccio: blocco config separato, ottenendo come parametro

Con un prolungamento (more on extensions here) questa può essere mantenuta facilmente "separati" in vari blocchi nella config.yml e poi iniettare che come parametro ricavato dal controller.

Dentro la classe di estensione all'interno della directory DependencyInjection scrivere 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 
    } 

Poi, nel tuo config.yml, config_dev.yml e in modo da poter impostare

my_nice_project: 
    contact_email: [email protected] 

Per essere in grado di elaborare che config.yml all'interno del tuo MyNiceBundleExtension avrai anche bisogno di una classe Configuration 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; 
    } 
} 

allora si può ottenere la configurazione dal controller, come avete voluto nella tua domanda iniziale, ma mantenendo il parameters.yml pulita, e l'impostazione nel config.yml in sezioni separate:

$recipient = $this->container->getParameter('my_nice_project.contact_email'); 

secondo approccio: Separato blocco config, iniettando la configurazione in un servizio

per i lettori alla ricerca di qualcosa di simile, ma per ottenere la configurazione da un servizio, v'è anche un modo più bello che mai ingombra il "paramaters" spazio comune e che addirittura non hanno bisogno della container da passare al servizio (passare l'intero container è una pratica da evitare).

Questo trucco sopra ancora "inietta" nei parametri dello spazio di configurazione.

Tuttavia, dopo aver caricato la definizione del servizio, è possibile aggiungere un metodo-chiamata come ad esempio setConfig() che inietta tale blocco solo per il servizio.

Per esempio, nella classe di estensione:

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' ])); 
    } 
} 

Poi, nel tuo services.yml si definisce il vostro servizio, come al solito, senza alcuna variazione assoluta:

services: 
    my.niceproject.sillymanager: 
     class: My\NiceProjectBundle\Model\SillyManager 
     arguments: [] 

E poi nella classe SillyManager, basta aggiungere il metodo:

class SillyManager 
{ 
    private $contact_email; 

    public function setConfig($newConfigContactEmail) 
    { 
     $this->contact_email = $newConfigContactEmail; 
    } 
} 

Nota tha questo funziona anche per gli array al posto dei valori scalari!Immaginate che si configura una coda di coniglio e bisogno di accoglienza, utente e password:

my_nice_project: 
    amqp: 
     host: 192.168.33.55 
     user: guest 
     password: guest 

Naturalmente è necessario cambiare il vostro albero, ma allora si può fare:

$sillyServiceDefintion->addMethodCall('setConfig', array($processedConfig[ 'amqp' ])); 

e poi nel servizio fare :

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 aiuti!

+9

Eccellente! Grazie per la risposta dettagliata. – Jekis

+12

Questa dovrebbe essere la risposta! – nicom974

+0

Se ti stai chiedendo cosa c'è di diverso tra il primo approccio e la documentazione, è che i valori di configurazione sono convertiti in parametri nel metodo 'MyNiceProjectExtension-> load()' con questa riga: '$ container-> setParameter ('my_nice_project. contact_email ', $ processedConfig [' contact_email ']); '. Grazie Xavi! – jxmallett

2

ho imparato un modo semplice da esempio di codice di http://tutorial.symblog.co.uk/

1) notare la ZendeskBlueFormBundle e file di posizione

# myproject/app/config/config.yml 

imports: 
    - { resource: parameters.yml } 
    - { resource: security.yml } 
    - { resource: @ZendeskBlueFormBundle/Resources/config/config.yml } 

framework: 

2) notare Zendesk_BlueForm.emails.contact_email e il percorso del file

# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml 

parameters: 
    # Zendesk contact email address 
    Zendesk_BlueForm.emails.contact_email: [email protected] 

3) avviso come ottengo in $ client e posizione file del controller

# myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php 

    public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request) 
    { 
    $client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email")); 
    ... 
    } 
Problemi correlati