Tengo algunas constantes de clase en mi clase de entidad, por ejemplo:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
En PHP normal, a menudo lo hago if($var == Entity::TYPE_PERSON)
y me gustaría hacer este tipo de cosas en Twig. ¿Es posible?
{% if var is constant('TYPE_PERSON', object) %}
Solo para ahorrar tiempo. Si necesita acceder a las constantes de clase en el espacio de nombres, use
fuente
{% if var == object.MY_CONSTANT %}
A partir de 1.12.1 también puede leer constantes de instancias de objetos:
fuente
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc ){{ constant('TYPE_PERSON', entity) }}
, es posible hacer lo siguiente (instanciar clase de entidad)$this->render('index.html.twig', ['entity' => new Entity()]);
Editar: he encontrado una mejor solución, lea sobre esto aquí.
Digamos que tienes clase:
Crear y registrar la extensión Twig:
Ahora puedes usar constantes en Twig como:
fuente
constant()
con FQN sería molesto.Si está utilizando espacios de nombres
¡Importante! Use barras dobles, en lugar de simples
fuente
En las mejores prácticas del libro de Symfony hay una sección con este problema:
Y use esta constante en la plantilla de ramita:
Aquí el enlace: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
fuente
Después de algunos años, me di cuenta de que mi respuesta anterior no es realmente tan buena. He creado una extensión que resuelve mejor el problema. Se publica como código abierto.
https://github.com/dpolac/twig-const
Define un nuevo operador Twig
#
que le permite acceder a la constante de clase a través de cualquier objeto de esa clase.Úselo así:
{% if entity.type == entity#TYPE_PERSON %}
fuente
User#TYPE_PERSON
, laNodeExpression
clase podría ser cambiado a algo como esto, que trabajó para mí:->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Por supuesto, esto limita sus clases alApp\Entity
espacio de nombres, pero creo que cubre el caso de uso más común.