So erhalten Sie Konfigurationsparameter in Symfony2 Twig Templates


170

Ich habe eine Symfony2 Twig-Vorlage. Ich möchte den Wert eines Konfigurationsparameters in dieser Zweigvorlage (eine Versionsnummer) ausgeben. Deshalb habe ich den Konfigurationsparameter folgendermaßen definiert:

parameters:
    app.version: 0.1.0

Ich kann diesen Konfigurationsparameter in Controllern verwenden, habe aber keine Ahnung, wie ich ihn in meine Twig-Vorlage bekomme.

Antworten:


406

Sie können die Parametersubstitution im Abschnitt twig globals der Konfiguration verwenden:

Parameterkonfiguration:

parameters:
    app.version: 0.1.0

Zweigkonfiguration:

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

Zweigvorlage:

{{ version }}

Diese Methode bietet den Vorteil, dass Sie den Parameter auch in ContainerAwareKlassen verwenden können, indem Sie Folgendes verwenden:

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

Gute Antwort. Nachtrag: Seit Symfony 3.1 muss eine Variable in Anführungszeichen gesetzt werden: "% app.version%"
BigJ

@ BigJ: Aktualisiert, um Anführungszeichen einzuschließen, da dies auch in älteren Versionen funktioniert.
Ryall

2
Dies sollte definitiv die akzeptierte Antwort sein. Vielen Dank !
Cyrille

191

Sie können ganz einfach in Ihrer Konfigurationsdatei Folgendes definieren:

twig:
    globals:
        version: "0.1.0"

Und greifen Sie in Ihrer Vorlage mit darauf zu

{{ version }}

Andernfalls muss es eine Möglichkeit mit einer Twig-Erweiterung sein, Ihre Parameter verfügbar zu machen.


28
Besser in Parametern wie @Ryall erklärt einstellen.
MrGlass

89

Sie können auch das integrierte Service Parameters-System nutzen, mit dem Sie den Wert isolieren oder wiederverwenden können:

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

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

Jetzt ist die Variable ga_tracking in allen Twig-Vorlagen verfügbar:

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

Der Parameter ist auch in den Controllern verfügbar:

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

Sie können einen Service auch als globale Twig-Variable (Symfony2.2 +) definieren:

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

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

Wenn die globale Variable, die Sie festlegen möchten, komplizierter ist - beispielsweise ein Objekt -, können Sie die oben beschriebene Methode nicht verwenden. Stattdessen müssen Sie eine Zweigerweiterung erstellen und die globale Variable als einen der Einträge in der Methode getGlobals zurückgeben.


5
Dies scheint die beste Lösung zu sein, da alle Systemkenntnisse zusammengehalten werden.
Jānis Gruzis

19

In neueren Versionen von Symfony2 (mit a parameters.ymlanstelle von parameters.ini) können Sie Objekte oder Arrays anstelle von Schlüssel-Wert-Paaren speichern, sodass Sie Ihre Globals folgendermaßen verwalten können:

config.yml (nur einmal bearbeitet):

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

parameters.yml:

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

Und dann können Sie in einer Zweigdatei {{ project.version }}oder verwenden {{ project.name }}.

Hinweis: Ich persönlich mag es nicht, Dinge hinzuzufügen app, nur weil dies die Variable von Symfony ist und ich nicht weiß, was dort in Zukunft gespeichert wird.


16

Die oben angegebenen Antworten sind korrekt und funktionieren einwandfrei. Ich habe es anders gemacht.

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%

Innerhalb des Controllers:

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

Innerhalb der Vorlagen- / Zweigdatei:

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

So verwenden Sie den Controller-Ausgang:

Regler:

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

Vorlagen- / Zweigdatei:

Project version {{ app_version }}

Ich erwähnte die verschiedenen zum besseren Verständnis.


1
Ja schön, diese Antwort erklärt sehr gut beide Möglichkeiten: Übergeben über den Controller und Übergeben als globale Zweigvariable! +1
Gottlieb Notschnabel

12

Mit einer Twig-Erweiterung können Sie eine parameterTwig-Funktion erstellen :

{{ 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 }

Vielen Dank dafür, ich befürchtete, ich müsste den Parameter aus der Parameterdatei auf die Zweigglobale duplizieren.
Joe Yahchouchi

Schön, aber es ist keine unnötige Überlastung, den gesamten Container für einen Parameter zur Erweiterung zu ziehen?
Lajdák Marek

Ich glaube, mit Symfony 2 können Sie keine Containerparameter injizieren (was jetzt mit Symfony 4/5 möglich ist)
Thomas Decaux

1

Sie können den $this->getParameter('app.version')Controller einfach an twig param binden und dann rendern.


-3

In confing.yml

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

In der Zweigansicht

# twig view
{{ version }}

2
Es ist keine gute Idee, Zugriff auf den gesamten Service-Container zu gewähren. Der Container ist ein Service Locator und sollte nicht einmal mit Abhängigkeitsinjektion injiziert werden, also auch nicht in Zweig
Paul Andrieux
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.