如何访问Twig中的类常量?

can*_*nni 126 php templates twig

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

class Entity {
    const TYPE_PERSON = 0;
    const TYPE_COMPANY = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

mes*_*age 228

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

{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意双斜线很重要.我浪费了几分钟,因为我没有放入双反斜杠. (20认同)
  • 哇,这很难看:-)如果Twig能使常量看起来像其他属性/变量那样会很好.例如`{%if var == object.MY_CONSTANT%}` (7认同)

Nik*_*kiC 175

{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}
Run Code Online (Sandbox Code Playgroud)

请参阅constant功能constant测试的文档.

  • 您应该将对象实例的测试内容添加到您的anwser` {%if var is constant('TYPE_PERSON',object)%} (3认同)

Ale*_*rov 26

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

{% if var == constant('TYPE_PERSON', entity)
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nin 10

如果您使用名称空间

{{ constant('Namespace\\Entity::TYPE_COMPANY') }}
Run Code Online (Sandbox Code Playgroud)

重要!使用双斜杠,而不是单斜杠


Dam*_*lac 10

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



假设你上课了:

namespace MyNamespace;
class MyClass
{
    const MY_CONSTANT = 'my_constant';
    const MY_CONSTANT2 = 'const2';
}
Run Code Online (Sandbox Code Playgroud)

创建并注册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
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以在Twig中使用常量了:

{{ MyClass.MY_CONSTANT }}
Run Code Online (Sandbox Code Playgroud)

  • 因此,为每个类定义一个完整的twig扩展比使用{{constant('Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}}更"难看"?当你的班级名称重叠时你会怎么做?你在这里失去了命名空间的所有好处 (11认同)

Chr*_*eel 8

在Symfony的书籍最佳实践中,有一个部分涉及此问题:

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

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}
Run Code Online (Sandbox Code Playgroud)

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

<p>
    Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>
Run Code Online (Sandbox Code Playgroud)

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