Comment obtenir les paramètres de configuration dans les modèles Symfony2 Twig

170

J'ai un modèle Symfony2 Twig. Je veux afficher la valeur d'un paramètre de configuration dans ce modèle de brindille (un numéro de version). Par conséquent, j'ai défini le paramètre de configuration comme ceci:

parameters:
    app.version: 0.1.0

Je suis capable d'utiliser ce paramètre de configuration dans les contrôleurs mais je n'ai aucune idée de comment l'obtenir dans mon modèle Twig.

Timo Haberkern
la source

Réponses:

406

Vous pouvez utiliser la substitution de paramètres dans la section twig globals de la configuration:

Configuration des paramètres:

parameters:
    app.version: 0.1.0

Config Twig:

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

Modèle de brindille:

{{ version }}

Cette méthode offre l'avantage de vous permettre également d'utiliser le paramètre dans les ContainerAwareclasses, en utilisant:

$container->getParameter('app.version');
Ryall
la source
Bonne réponse. Addendum: depuis Symfony 3.1 une variable doit être entre guillemets: "% app.version%"
BigJ
@BigJ: mis à jour pour inclure des citations, car cela fonctionnera également dans les anciennes versions.
Ryall
2
Cela devrait certainement être la réponse acceptée. Merci !
Cyrille
191

Vous pouvez facilement définir dans votre fichier de configuration:

twig:
    globals:
        version: "0.1.0"

Et accédez-y dans votre modèle avec

{{ version }}

Sinon, cela doit être un moyen avec une extension Twig d'exposer vos paramètres.

webda2l
la source
28
Mieux vaut le définir dans des paramètres comme @Ryall expliqué.
MrGlass
89

Vous pouvez également tirer parti du système de paramètres de service intégré, qui vous permet d'isoler ou de réutiliser la valeur:

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

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

Désormais, la variable ga_tracking est disponible dans tous les modèles Twig:

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

Le paramètre est également disponible à l'intérieur des contrôleurs:

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

Vous pouvez également définir un service en tant que variable globale Twig (Symfony2.2 +):

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

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

Si la variable globale que vous souhaitez définir est plus compliquée - disons un objet - vous ne pourrez pas utiliser la méthode ci-dessus. Au lieu de cela, vous devrez créer une extension Twig et renvoyer la variable globale comme l'une des entrées de la méthode getGlobals.

Francesco Casula
la source
5
Cela semble être la meilleure solution car elle permet de rassembler toutes les connaissances du système.
Jānis Gruzis
19

Sur les versions plus récentes de Symfony2 (en utilisant a parameters.ymlau lieu de parameters.ini), vous pouvez stocker des objets ou des tableaux au lieu de paires clé-valeur, vous pouvez donc gérer vos globaux de cette manière:

config.yml (modifié une seule fois):

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

parameters.yml:

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

Et puis dans un fichier twig, vous pouvez utiliser {{ project.version }}ou {{ project.name }}.

Note: Personnellement, je n'aime pas ajouter des choses à app, juste parce que c'est la variable de Symfony et que je ne sais pas ce qui y sera stocké à l'avenir.

Alain Tiemblo
la source
16

Les réponses ci-dessus sont correctes et fonctionnent correctement. Je l'ai utilisé d'une manière différente.

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%

Contrôleur intérieur:

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

Modèle intérieur / fichier de brindille:

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

Pour utiliser la sortie du contrôleur:

Manette:

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

fichier modèle / brindille:

Project version {{ app_version }}

J'ai évoqué les différents pour mieux comprendre.

Sudhakar Krishnan
la source
1
Ouais sympa, cette réponse explique très bien les deux sens: en passant par le contrôleur et en le passant en tant que variable global twig! +1
Gottlieb Notschnabel
12

Avec une extension Twig, vous pouvez créer une parameterfonction 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 }
Thomas Decaux
la source
Merci pour cela, je craignais de devoir dupliquer le paramètre du fichier de paramètres vers les globaux de brindilles.
Joe Yahchouchi
Bien, mais ce n'est pas une surcharge inutile tirez le conteneur entier vers l'extension pour un paramètre?
Lajdák Marek le
Je crois qu'avec Symfony 2, vous ne pouvez pas injecter de paramètres de conteneur (ce qui est désormais possible avec Symfony 4/5)
Thomas Decaux
1

Vous pouvez simplement lier le $this->getParameter('app.version')contrôleur au paramètre twig, puis le rendre.

Jean-Luc Barat
la source
-3

Dans confing.yml

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

Dans la vue Twig

# twig view
{{ version }}
Le Petit Monde de Purexo
la source
2
donner accès à l'ensemble du conteneur de service n'est pas une bonne idée. le container est un localisateur de service et il ne faut même pas l'injecter avec injection de dépendance, donc ni en brindille
Paul Andrieux