Accèdez facilement à vos constantes Twig avec TwigConstantAccessorBundle

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

C'est sans surprise que la plupart des développeurs Symfony utilisent Twig comme moteur de templating, il s'agit en effet du moteur fourni par défaut avec le framework. Il arrive souvent que l'on soit amené à accéder à des constantes dans nos vues. Pour cela, Twig nous propose différentes solutions.

La solution la plus évidente est certainement l'utilisation de la fonction constant ainsi que du test correspondant.

{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
{{ constant('RSS', date) }}

{% if post.status is constant('Post::PUBLISHED') %} ... {% endif %}
{% if post.status is constant('PUBLISHED', post) %} ... {% endif %}

La configuration de Symfony permet également de définir un certain nombre de variables, services et constantes pouvant être accessible directement depuis vos templates Twig.

# app/config/config.yml
twig:
    # ...
    globals:
        my_service:      "@my_service"
        my_constant_foo: foo
        my_constant_bar: bar

Une méthode moins répandue est de passer par une extension Twig. Mais attention, cette possibilité est maintenant dépréciée et sera supprimée dans la version 2 de Twig.

class Project_Twig_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface
{
    public function getGlobals()
    {
        return array(
            'text' => new Text(),
        );
    }

    // ...
}

Pour réduire tout ce travail de configuration, j'ai créé un bundle visant à simplifier l'accès aux constantes de classe dans les templates Twig. Une fois installé, il suffit de définir les classes dont vous souhaitez exposer les constantes et le bundle s'occupe entièrement de la gestion de la configuration.

# app/config/config.yml
twig_constant_accessor:
    classes:
        - AppBundle\Model\Foo
        - { class: 'AppBundle\Model\Bar' }
        - { class: 'AppBundle\Model\FooBar', alias: 'FooBarAlias' }

Avec cette configuration, vous aurez directement accès aux constantes dans vos vues Twig :

{{ Foo.MY_CONSTANT }} {# access AppBundle\Model\Foo::MY_CONSTANT #}
{{ Bar.KEY }}  {# access AppBundle\Model\Bar::KEY #}

{% if 'value' == FooBarAlias.MY_CONSTANT %}Test is OK{% endif %}
{# FooBarAlias is an alias for AppBundle\Model\FooBar #}