I have a few class constants in my entity class, e.g.:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
In normal PHP I often do if($var == Entity::TYPE_PERSON)
and I would like to do this kind of stuff in Twig. Is it possible?
Just to save your time. If you need to access class constants under namespace, use
{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}
See documentation for the constant
function and the constant
test.
{% if var is constant('TYPE_PERSON', object) %}
As of 1.12.1 you can read constants from object instances as well:
{% if var == constant('TYPE_PERSON', entity)
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
(doc)
{{ constant('TYPE_PERSON', entity) }}
, it's possible to do following (instantiate Entity class) $this->render('index.html.twig', ['entity' => new Entity()]);
constant('SOME_CONSTANT', form.getFoo())
where getFoo()
returns the custom FormType PHP class.
If you are using namespaces
{{ constant('Namespace\\Entity::TYPE_COMPANY') }}
Important! Use double slashes, instead of single
Edit: I've found better solution, read about it here.
Read more about how to create and register extension in Twig documentation.
Read about Twig extensions in Symfony2 documentation.
Let's say you have class:
namespace MyNamespace;
class MyClass
{
const MY_CONSTANT = 'my_constant';
const MY_CONSTANT2 = 'const2';
}
Create and register Twig extension:
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
);
}
}
Now you can use constants in Twig like:
{{ MyClass.MY_CONSTANT }}
constant()
with FQN would be bothersome.
In book best practices of Symfony there is a section with this issue:
Constants can be used for example in your Twig templates thanks to the constant() function:
// src/AppBundle/Entity/Post.php
namespace AppBundle\Entity;
class Post
{
const NUM_ITEMS = 10;
// ...
}
And use this constant in template twig:
<p>
Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>
Here the link: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
After some years I realized that my previous answer is not really so good. I have created extension that solves problem better. It's published as open source.
https://github.com/dpolac/twig-const
It defines new Twig operator #
which let you access the class constant through any object of that class.
Use it like that:
{% if entity.type == entity#TYPE_PERSON %}
User#TYPE_PERSON
, the NodeExpression
class could be changed to something like this, which worked for me: ->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Of course, this limits your classes to the App\Entity
namespace, but I think that covers the most common use case.
Success story sharing
{% if var == object.MY_CONSTANT %}