Come ottenere i parametri di configurazione nei template Twig di Symfony2


170

Ho un modello di ramoscello di Symfony2. Voglio ottenere il valore di un parametro di configurazione in questo modello di ramoscello (un numero di versione). Pertanto ho definito il parametro config in questo modo:

parameters:
    app.version: 0.1.0

Sono in grado di utilizzare questo parametro di configurazione in Controller ma non ho idea di come ottenerlo nel mio modello Twig.

Risposte:


406

Puoi usare la sostituzione dei parametri nella sezione dei ramoscelli della configurazione:

Configurazione parametri:

parameters:
    app.version: 0.1.0

Configurazione ramoscello:

twig:
    globals:
        version: '%app.version%'

Modello di ramoscello:

{{ version }}

Questo metodo offre il vantaggio di consentire l'utilizzo del parametro anche nelle ContainerAwareclassi, utilizzando:

$container->getParameter('app.version');

Buona risposta. Addendum: da Symfony 3.1 è necessario citare una variabile: "% app.version%"
BigJ

@BigJ: aggiornato per includere le virgolette, poiché funzionerà anche nelle versioni precedenti.
Ryall

2
Questa dovrebbe essere sicuramente la risposta accettata. Grazie !
Cyrille,

191

Facilmente, puoi definire nel tuo file di configurazione:

twig:
    globals:
        version: "0.1.0"

E accedi al tuo modello con

{{ version }}

Altrimenti deve essere un modo con un'estensione Twig per esporre i tuoi parametri.


28
Meglio impostarlo in parametri come spiegato @Ryall.
MrGlass

89

È inoltre possibile sfruttare il sistema di parametri di servizio integrato, che consente di isolare o riutilizzare il valore:

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

Ora, la variabile ga_tracking è disponibile in tutti i modelli di Twig:

<p>The google tracking code is: {{ ga_tracking }}</p>

Il parametro è disponibile anche all'interno dei controller:

$this->container->getParameter('ga_tracking');

Puoi anche definire un servizio come variabile Twig globale (Symfony2.2 +):

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"

http://symfony.com/doc/current/templating/global_variables.html

Se la variabile globale che si desidera impostare è più complicata, ad esempio un oggetto, non sarà possibile utilizzare il metodo sopra. Invece, dovrai creare un'estensione Twig e restituire la variabile globale come una delle voci nel metodo getGlobals.


5
Questa sembra la soluzione migliore perché mantiene tutta la conoscenza del sistema insieme.
Jānis Gruzis,

19

Nelle versioni più recenti di Symfony2 (usando un parameters.ymlinvece di parameters.ini), puoi archiviare oggetti o matrici invece di coppie chiave-valore, così puoi gestire i tuoi globali in questo modo:

config.yml (modificato solo una volta):

# app/config/config.yml
twig:
  globals:
    project: %project%

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42

E poi in un file ramoscello, puoi usare {{ project.version }}o {{ project.name }}.

Nota: personalmente non mi piace aggiungere cose a app, solo perché questa è la variabile di Symfony e non so cosa sarà memorizzato lì in futuro.


16

Le risposte sopra riportate sono corrette e funzionano bene. L'ho usato in un modo diverso.

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }

app.yml

parameters:
  app.version:           1.0.1

app_twig.yml

twig:
  globals:
    version: %app.version%

Controller interno:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml

All'interno del file template / ramoscello:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}

Per utilizzare l'uscita del controller:

controller:

public function indexAction() {
        $application_version = $this->container->getParameter('app.version');
        return array('app_version' => $application_version);
    }

file template / ramoscello:

Project version {{ app_version }}

Ho citato il diverso per capire meglio.


1
Sì, bello, questa risposta spiega molto bene entrambi i modi: passando attraverso il controller e passando come una variabile globale ramoscello! +1
Gottlieb Notschnabel,

12

Con un'estensione Twig, puoi creare una parameterfunzione Twig:

{{ parameter('jira_host') }}

TwigExtension.php:

class TwigExtension extends \Twig_Extension
{
    public $container;

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('parameter', function($name)
            {
                return $this->container->getParameter($name);
            })
        ];
    }


    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'iz';
    }
}

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }

Grazie per questo, ero preoccupato di dover duplicare il parametro dal file dei parametri ai globi ramoscello.
Joe Yahchouchi,

Bello, ma non è un sovraccarico inutile trascinare l'intero contenitore in estensione per un parametro?
Lajdák Marek,

Credo con Symfony 2, non è possibile iniettare i parametri del contenitore (che ora è possibile con Symfony 4/5)
Thomas Decaux,

1

Puoi semplicemente associare il $this->getParameter('app.version')controller al ramoscello param e quindi renderizzarlo.


-3

In confing.yml

# app/config/config.yml
twig:
  globals:
    version: '%app.version%'

In vista Ramoscello

# twig view
{{ version }}

2
dare accesso all'intero container di servizi non è una buona idea. il contenitore è un localizzatore di servizi e non deve nemmeno essere iniettato con iniezione di dipendenza, quindi nemmeno in un ramoscello
Paul Andrieux,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.