¿Cómo acceder a las constantes de clase en Twig?

6 minutos de lectura

avatar de usuario
Canni

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 hago if($var == Entity::TYPE_PERSON) y me gustaría hacer este tipo de cosas en Twig. ¿Es posible?

avatar de usuario
mensaje

Solo para ahorrar tiempo. Si necesita acceder a las constantes de clase en el espacio de nombres, use

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

  • Es importante tener en cuenta que las barras dobles son importantes. Perdí unos minutos porque no puse las barras invertidas dobles.

    – Dan Morphis

    2 de noviembre de 2013 a las 0:18

  • Wow, eso es feo 🙂 Sería bueno si Twig pudiera hacer que las constantes se vean como otras propiedades/variables. p.ej {% if var == object.MY_CONSTANT %}

    –Rik Heywood

    8 de junio de 2014 a las 9:43

avatar de usuario
nikic

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

Consulte la documentación de la constant función y el constant prueba.

  • Debe agregar elementos de prueba con instancia de objeto a su respuesta {% if var is constant('TYPE_PERSON', object) %}

    – ioleo

    21/10/2014 a las 14:45

  • Funcionó cuando escribí el espacio de nombres, como el mensaje de @message.

    – artesano

    10 de febrero de 2015 a las 12:57

A partir de 1.12.1, también puede leer constantes de instancias de objetos:

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

  • Esto solo funciona si la entidad es una instancia de Entidad, creo que la pregunta es sobre cómo acceder a una constante sin un objeto definido en la plantilla.

    – Sergi

    3 de febrero de 2016 a las 15:38

  • En ese caso solo escribe {{ constant('Namespace\\Classname::CONSTANT_NAME') }} (doc)

    – alexfv

    3 de febrero de 2016 a las 16:12


  • Lo bueno de esto es que facilita el uso de una variable Twig en lugar de una cadena literal como nombre constante.

    –CJ Dennis

    6 de junio de 2018 a las 1:45

  • Solo por claridad. Si desea pasar constantes dentro de una clase como twig vriable y usarlas como {{ constant('TYPE_PERSON', entity) }}es posible hacer lo siguiente (instanciar clase de Entidad) $this->render('index.html.twig', ['entity' => new Entity()]);

    – Alexandr Tsyganok

    23 de abril de 2019 a las 20:05

  • Me pregunto si puedes usar constant('SOME_CONSTANT', form.getFoo()) dónde getFoo() devuelve la clase PHP FormType personalizada.

    – rybo111

    22 de febrero a las 14:11

Si está utilizando espacios de nombres

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

¡Importante! Use barras dobles, en lugar de simples

avatar de usuario
Damián Polac

Editar: he encontrado una mejor solución, lea sobre esto aquí.



Digamos que tienes clase:

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

Crear y registrar la extensión 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
        );
    }
}

Ahora puedes usar constantes en Twig como:

{{ MyClass.MY_CONSTANT }}

  • Entonces, definir una extensión twig completa para cada clase es menos “feo” que usar {{ constant(‘Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT’) }} ? ¿Y qué haces cuando los nombres de tus clases se superponen? pierdes todos los beneficios de los espacios de nombres aquí

    – 0x1 gen

    27 ago 2015 a las 20:37

  • Tengo una solución similar, aunque podría extraer esto en un paquete. El problema con esta solución es que tiene una sobrecarga de reflexión. En Symfony puedes escribir un pase de compilador para resolver esto cuando se compila el contenedor.

    – Cualquiera

    15 de enero de 2016 a las 8:06

  • @ 0x1gene Tiene razón, los nombres de las clases pueden superponerse. Silenciosamente asumí que MyClass no es cualquier clase, sino una clase que es muy importante dentro del proyecto. Y se usa con la frecuencia suficiente para usar constant() con FQN sería molesto.

    – Damián Polac

    21 de mayo de 2016 a las 19:48

  • @DamianPolac, ¿sabe que PHPStorm solicitará la selección de variables en el archivo twig?

    – Codio

    21 de junio de 2020 a las 8:38

avatar de usuario
crisweel

En el libro de mejores prácticas de Symfony hay una sección con este problema:

Las constantes se pueden usar, por ejemplo, en sus plantillas Twig gracias a la función constant():

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

Y usa esta constante en la plantilla twig:

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

Aquí el enlace:
http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options

  • Entonces, definir una extensión twig completa para cada clase es menos “feo” que usar {{ constant(‘Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT’) }} ? ¿Y qué haces cuando los nombres de tus clases se superponen? pierdes todos los beneficios de los espacios de nombres aquí

    – 0x1 gen

    27 ago 2015 a las 20:37

  • Tengo una solución similar, aunque podría extraer esto en un paquete. El problema con esta solución es que tiene una sobrecarga de reflexión. En Symfony puedes escribir un pase de compilador para resolver esto cuando se compila el contenedor.

    – Cualquiera

    15 de enero de 2016 a las 8:06

  • @ 0x1gene Tiene razón, los nombres de las clases pueden superponerse. Silenciosamente asumí que MyClass no es cualquier clase, sino una clase que es muy importante dentro del proyecto. Y se usa con la frecuencia suficiente para usar constant() con FQN sería molesto.

    – Damián Polac

    21 de mayo de 2016 a las 19:48

  • @DamianPolac, ¿sabe que PHPStorm solicitará la selección de variables en el archivo twig?

    – Codio

    21 de junio de 2020 a las 8:38

avatar de usuario
Damián Polac

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. Está publicado como código abierto.

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

Define nuevo operador Twig # que le permite acceder a la constante de clase a través de cualquier objeto de esa clase.

Úsalo así:

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

  • Gracias por la idea, nunca había pensado en esto! Si desea utilizar nombres de clase de entidad sin crear instancias de objetos, por ejemplo User#TYPE_PERSONla NodeExpression la clase podría cambiarse a algo como esto, lo que funcionó para mí: ->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))'). Por supuesto, esto limita sus clases a la App\Entity espacio de nombres, pero creo que cubre el caso de uso más común.

    – futuro

    19 mayo 2018 a las 16:59

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad