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.

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

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.


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.


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.


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.


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 }

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.


-3

Dans confing.yml

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

Dans la vue Twig

# twig view
{{ version }}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.