如何在Twig中访问类常量?


133

我的实体类中有一些类常量,例如:

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

在普通的PHP中,我经常这样做if($var == Entity::TYPE_PERSON),我想在Twig中做这种事情。可能吗?

Answers:


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

有关constant功能constant测试,请参见文档。


3
您应该将包含对象实例的测试内容添加到anwser中{% if var is constant('TYPE_PERSON', object) %}
ioleo 2014年

1
当我键入名称空间(如@message的消息)时,此方法有效。
手工艺者

232

只是为了节省您的时间。如果需要访问命名空间下的类常量,请使用

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

22
重要的是要注意,双斜杠很重要。我浪费了几分钟,因为我没有把双反斜杠英寸
丹·莫尔菲斯

谢谢!你节省我的时间!:)
sintetico82

7
哇,这很丑陋:-)如果Twig可以使常量看起来像其他属性/变量,那将是很好的。例如{% if var == object.MY_CONSTANT %}
Rik Heywood

27

从1.12.1开始,您还可以从对象实例读取常量:

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

这仅在entity是Entity的实例的情况下才有效,我认为问题在于访问模板中没有定义对象的常量。
塞尔吉(Sergi)

在这种情况下,您只需撰写{{ constant('Namespace\\Classname::CONSTANT_NAME') }}doc
亚历山大·费多罗夫

这样做的好处是可以轻松地使用Twig变量而不是字符串文字作为常量名称。
CJ丹尼斯

为了清楚起见。如果您想将一个类中的常量作为twig vriable传递并像这样使用它{{ constant('TYPE_PERSON', entity) }},则可以执行以下操作(实例化实体类)$this->render('index.html.twig', ['entity' => new Entity()]);
Alexandr Tsyganok

13

编辑:我找到了更好的解决方案,请在此处阅读。



假设您有课:

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

创建并注册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
        );
    }
}

现在,您可以像下面这样在Twig中使用常量:

{{ MyClass.MY_CONSTANT }}

12
因此,为每个类定义完整的树枝扩展比使用{{constant('Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}}来说“麻烦”得多?当班级名称重叠时,您会怎么做?您在这里
失去

1
我有一个类似的解决方案,不过我可能会将其提取到捆绑包中。该解决方案的问题是您有反射开销。在symfony中,您可以编写一个编译器通道以在编译容器时解决此问题。
任何人

@ 0x1gene是的,类名可以重叠。我默默地认为MyClass不仅是任何类,而且是在项目中非常重要的类。并且经常使用constant(),因此与FQN一起使用会很麻烦。
达米安·波拉克

@DamianPolac您知道PHPStorm会在树枝文件中提示选择变量吗?
刺松


9

在Symfony的最佳做法书中,有一个涉及此问题的部分:

由于constant()函数,例如可以在Twig模板中使用常量:

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

并在模板树枝中使用此常量:

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

此处的链接:http : //symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options


4

几年后,我意识到我以前的回答并不是那么好。我创建了扩展程序,可以更好地解决问题。它以开源形式发布。

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

它定义了新的Twig运算符#,该运算符使您可以通过该类的任何对象访问该类常量。

像这样使用它:

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


谢谢你的主意,我从未想过!如果您想不实例化对象使用实体类的名称,例如User#TYPE_PERSON,在NodeExpression类可能被更改为这样的事情,这为我工作:->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')。当然,这将您的类限制为App\Entity名称空间,但是我认为这涵盖了最常见的用例。
未来的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.