Hvordan leser jeg konfigurasjonsinnstillinger fra Symfony2 config.yml?

stemmer
183

Jeg har lagt til en innstilling til min config.yml fil slik:

app.config:
    contact_email: somebody@gmail.com
    ...

For livet av meg, kan jeg ikke finne ut hvordan du skal lese den i en variabel. Jeg prøvde noe som dette i en av mine kontrollere:

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

Men jeg får en feilmelding som sier:

Parameteren contact_email må være definert.

Jeg har fjernet min cache, jeg også sett overalt på Symfony2 reloaded nettstedet dokumentasjon, men jeg kan ikke finne ut hvordan du gjør dette.

Sannsynligvis bare for trøtt til å finne ut av dette nå. Kan noen hjelpe med dette?

Publisert på 27/01/2011 klokken 20:50
kilden bruker
På andre språk...                            


6 svar

stemmer
191

Snarere enn å definere contact_emailinnenfor app.config, definere det i en parametersoppføring:

parameters:
    contact_email: somebody@gmail.com

Du bør finne samtalen du gjør i din kontrolleren fungerer nå.

Svarte 30/01/2011 kl. 20:45
kilden bruker

stemmer
162

Mens løsningen med å flytte contact_emailtil parameters.ymler enkelt, som foreslått i andre svar, kan det lett rot parametere fil hvis du har med mange bunter eller hvis du har avtale med nestede blokker av konfigurasjon.

  • Først vil jeg svare strengt spørsmålet.
  • Senere vil jeg gi en tilnærming for å få de configs fra tjenester uten å måtte passere gjennom en felles plass som parametre.

Første tilnærmingen: Separert config blokken, får det som parameter

Med en forlengelse ( flere forlengninger her ) kan man holde denne lett "skilt" i forskjellige blokker i den config.yml, og deretter injisere det som en parameter gettable fra kontrolleren.

Inni Extension klassen inne i DependencyInjectionkatalogen skriver dette:

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
    }

Så i config.yml, config_dev.yml og slik at du kan stille

my_nice_project:
    contact_email: someone@example.com

For å kunne behandle det config.ymlinne MyNiceBundleExtensiontrenger du også en Configurationklasse i samme navnerom:

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root( 'my_nice_project' );

        $rootNode->children()->scalarNode( 'contact_email' )->end();

        return $treeBuilder;
    }
}

Deretter kan du få config fra kontrolleren, som du ønsket i det opprinnelige spørsmålet, men å holde parameters.ymlrene, og sette den i config.ymlpå adskilte deler:

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

Andre tilnærmingen: Separert config blokk, injisere config til en tjeneste

For lesere på jakt etter noe lignende, men for å få config fra en tjeneste, det er enda en bedre måte som aldri clutters "paramaters" felles plass, og har selv ikke trenger containerå sendes til tjenesten (passerer hele beholderen er praksis å unngå).

Dette trikset ovenfor fortsatt "injiserer" i parametrene plass config.

Likevel, etter lasting din definisjon av tjenesten, kan du legge til en metode-kall som for eksempel setConfig()at injiserer den blokken bare til tjenesten.

For eksempel, i Extension klasse:

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

Så i ditt services.ymldu definere tjenesten som vanlig, uten noen absolutte endringen:

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

Og så i din SillyManagerklasse, bare legge metoden:

class SillyManager
{
    private $contact_email;

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

Merk at dette fungerer også for arrays i stedet for skalare verdier! Tenk deg at du konfigurerer en kanin kø og trenger vert, bruker og passord:

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

Selvfølgelig må du endre din treet, men da kan du gjøre:

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

og deretter i tjenesten gjøre:

class SillyManager
{
    private $host;
    private $user;
    private $password;

    public function setConfig( $config )
    {
        $this->host = $config[ 'host' ];
        $this->user = $config[ 'user' ];
        $this->password = $config[ 'password' ];
    }
}

Håper dette hjelper!

Svarte 24/03/2014 kl. 01:06
kilden bruker

stemmer
34

Jeg må legge til svar på douglas, du kan få tilgang til global config, men symfony overs noen parametere, for eksempel:

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

er

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

Du kan bruke var_dump å søke en spesifisert nøkkel eller verdi.

Svarte 07/08/2012 kl. 22:13
kilden bruker

stemmer
17

For å være i stand til å avsløre noen konfigurasjonsparametere for din pakke bør du se i dokumentasjonen for å gjøre det. Det er ganske enkelt å gjøre :)

Her er linken: Hvordan avsløre en semantisk konfigurasjon for en Bundle

Svarte 15/04/2013 kl. 12:37
kilden bruker

stemmer
7

Som om det var sa tidligere - kan du få tilgang til alle parametre ved hjelp av injeksjon container og bruke sin parameter eiendom.

"Symfony - Arbeide med beholdertjeneste Definisjoner" er en god artikkel om det.

Svarte 01/10/2012 kl. 20:23
kilden bruker

stemmer
3

Jeg lærte en enkel måte fra kode eksempel på http://tutorial.symblog.co.uk/

1) merke ZendeskBlueFormBundle og filplassering

# myproject/app/config/config.yml

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

framework:

2) merke Zendesk_BlueForm.emails.contact_email og filplassering

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

parameters:
    # Zendesk contact email address
    Zendesk_BlueForm.emails.contact_email: dunnleaddress@gmail.com

3) Legg merke til hvordan jeg får det i $ klient og filplassering på kontrolleren

# 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"));
    ...
    }
Svarte 16/11/2014 kl. 02:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more