Ich habe einige Klassenkonstanten in meiner Entitätsklasse, z.
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
In normalem PHP mache ich das oft if($var == Entity::TYPE_PERSON)
und ich würde gerne solche Sachen in Twig machen. Ist es möglich?
{% if var is constant('TYPE_PERSON', object) %}
Nur um Zeit zu sparen. Wenn Sie unter dem Namespace auf Klassenkonstanten zugreifen müssen, verwenden Sie
quelle
{% if var == object.MY_CONSTANT %}
Ab 1.12.1 können Sie auch Konstanten aus Objektinstanzen lesen:
quelle
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc ){{ constant('TYPE_PERSON', entity) }}
, können Sie Folgendes tun ($this->render('index.html.twig', ['entity' => new Entity()]);
Bearbeiten: Ich habe eine bessere Lösung gefunden, lesen Sie hier darüber.
Angenommen, Sie haben Klasse:
Twig-Erweiterung erstellen und registrieren:
Jetzt können Sie Konstanten in Twig wie folgt verwenden:
quelle
constant()
mit FQN lästig wäre.Wenn Sie Namespaces verwenden
Wichtig! Verwenden Sie doppelte Schrägstriche anstelle von einfachen
quelle
In den Best Practices für Symfony-Bücher gibt es einen Abschnitt mit diesem Problem:
Und verwenden Sie diese Konstante in Template Twig:
Hier der Link: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
quelle
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 einen neuen Twig-Operator, mit
#
dem Sie über ein beliebiges Objekt dieser Klasse auf die Klassenkonstante zugreifen können.Verwenden Sie es so:
{% if entity.type == entity#TYPE_PERSON %}
quelle
User#TYPE_PERSON
kann dieNodeExpression
Klasse in eine solche geändert werden, die für mich funktioniert hat :->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Dies beschränkt Ihre Klassen natürlich auf denApp\Entity
Namespace, aber ich denke, das deckt den häufigsten Anwendungsfall ab.