web-dev-qa-db-fra.com

Comment accéder aux constantes de classe dans Twig?

J'ai quelques constantes de classe dans ma classe d'entité, par exemple:

class Entity {
    const TYPE_PERSON = 0;
    const TYPE_COMPANY = 1;
}

En temps normal PHP je fais souvent if($var == Entity::TYPE_PERSON)] et je voudrais faire ce genre de choses dans Twig. Est-ce possible?

124
canni
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}

Voir la documentation pour la fonction constant et le constant test .

174
NikiC

Juste pour économiser votre temps. Si vous devez accéder à des constantes de classe sous un espace de noms, utilisez

{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
227
message

Depuis la version 1.12.1, vous pouvez également lire les constantes à partir d'instances d'objet:

{% if var == constant('TYPE_PERSON', entity)
24
Alexander Fedorov

Si vous utilisez des espaces de noms

{{ constant('Namespace\\Entity::TYPE_COMPANY') }}

Important! Utilisez des doubles barres obliques au lieu de simples

10
Dmitriy Apollonin

Edit: J'ai trouvé la meilleure solution, lisez à ce sujet ici.



Disons que vous avez cours:

namespace MyNamespace;
class MyClass
{
    const MY_CONSTANT = 'my_constant';
    const MY_CONSTANT2 = 'const2';
}

Créez et enregistrez l'extension Twig:

class MyClassExtension extends \Twig_Extension
{
    public function getName()
    { 
        return 'my_class_extension'; 
    }

    public function getGlobals()
    {
        $class = new \ReflectionClass('MyNamespace\MyClass');
        $constants = $class->getConstants();

        return array(
            'MyClass' => $constants
        );
    }
}

Maintenant, vous pouvez utiliser des constantes dans Twig comme:

{{ MyClass.MY_CONSTANT }}
10
Damian Polac

Dans les meilleures pratiques du livre de Symfony, une section présente ce problème:

Les constantes peuvent être utilisées par exemple dans vos templates Twig grâce à la fonction constant ():

// src/AppBundle/Entity/Post.php
namespace AppBundle\Entity;

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

Et utilisez cette constante dans template twig:

<p>
    Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>

Voici le lien: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options

8
Chrysweel

Après quelques années, j'ai réalisé que ma réponse précédente n'était pas vraiment bonne. J'ai créé une extension qui résout mieux le problème. Il est publié en open source.

https://github.com/dpolac/twig-const

Il définit new Twig opérateur # qui permet d’accéder à la constante de classe via n’importe quel objet de cette classe.

Utilisez-le comme ça:

{% if entity.type == entity#TYPE_PERSON %}

4
Damian Polac