webentwicklung-frage-antwort-db.com.de

Wie greife ich in Twig auf Klassenkonstanten zu?

Ich habe einige Klassenkonstanten in meiner Entitätsklasse, z.

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

In normalen PHP Ich mache oft if($var == Entity::TYPE_PERSON) und ich möchte solche Sachen in Twig machen. Ist es möglich?

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

Siehe Dokumentation für die Funktion constant und den Test constant .

174
NikiC

Nur um Zeit zu sparen. Wenn Sie unter Namespace auf Klassenkonstanten zugreifen müssen, verwenden Sie

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

Ab 1.12.1 können Sie auch Konstanten aus Objektinstanzen lesen:

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

Wenn Sie Namespaces verwenden

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

Wichtig! Verwenden Sie doppelte Schrägstriche anstelle von einfachen

10

Edit: Ich habe eine bessere Lösung gefunden, Lies es hier nach.



Nehmen wir an, Sie haben Unterricht:

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

Erstellen und registrieren Sie Twig Erweiterung:

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

Jetzt können Sie Konstanten in Twig wie folgt verwenden:

{{ MyClass.MY_CONSTANT }}
10
Damian Polac

In den Buch-Best Practices von Symfony finden Sie einen Abschnitt zu diesem Problem:

Konstanten können zum Beispiel in Ihren Twig Vorlagen dank der constant () Funktion verwendet werden:

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

Und benutze diese Konstante in template twig:

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

Hier der Link: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options

8
Chrysweel

Nach einigen Jahren wurde mir klar, dass meine vorherige Antwort nicht wirklich so gut ist. Ich habe eine Erweiterung erstellt, die das Problem besser löst. Es ist als Open Source veröffentlicht.

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

Es definiert den neuen Twig operator #, mit dem Sie über ein beliebiges Objekt dieser Klasse auf die Klassenkonstante zugreifen können.

Benutze es so:

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

4
Damian Polac