Php 在twig中使用名称空间别名

Php 在twig中使用名称空间别名,php,symfony,namespaces,twig,Php,Symfony,Namespaces,Twig,我有一个代码,用于检查细枝模板中的某个实体常量: {% if logRecord.status is constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_MONEY_RESERVED') %} 但是每次使用这么长的类名都是很尴尬的。有没有办法在twig中创建名称空间别名?比如: {% use App\\DealBundle\\Entity\\Deal %} {% if logRecord.status is constant('Deal::D

我有一个代码,用于检查细枝模板中的某个实体常量:

{% if logRecord.status is constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_MONEY_RESERVED') %}
但是每次使用这么长的类名都是很尴尬的。有没有办法在twig中创建名称空间别名?比如:

{% use App\\DealBundle\\Entity\\Deal %}
{% if logRecord.status is constant('Deal::DEAL_STATE_MONEY_RESERVED') %}
或者我总是需要写全名?

您可以使用:

并以这种方式使用它:

{% if logRecord.status == _self.state('MONEY_RESERVED') %}

不要忘记使用连字符(-)删除宏中的空白。

我遇到了同样的问题,解决方案非常简单。在我们的例子中,这个宏不起作用,因为我们不仅要将常量值用于渲染,还要将其用作值(int、string、float等)。这是不可能的,因为使用此宏Twig会将值转换为Twig_标记类

因此,解决方案是下一个。在您声明的模板中的某个位置:

    {% set namespace = 'App\\DealBundle\\Entity\\' %}
然后在另一个地方,您可以这样使用它:

    {% if logRecord.status is constant(namespace~'Deal::DEAL_STATE_MONEY_RESERVED') %}

我正在更新此版本,以防有人遇到与我相同的问题,并且不想使用任何特殊的扩展

@阿兰·蒂姆布洛的答案是正确的,就像小树枝不再识别自己的物体一样。因此,唯一要做的就是导入它,如:

{% macro state(name) -%}
    {{ constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_' ~ name) }}
{%- endmacro %}
{# ### Remember the import! ### #}
{% import _self as localMacros %}
然后你可以使用

{% if logRecord.status == localMacros.state('MONEY_RESERVED') %}

您始终需要编写完整的类名。你有没有想过,如果logRecord.status是state('reserved')的话,你可以像
那样做呢?
?是的,你可以为此编写一个twig函数。@Maerlyn是的,我可能会为它做一个自定义测试。非常感谢。哦,不,它不起作用:
类Twig\u标记的对象无法转换为int
。所以它返回一个宏对象,而不是它的值。我测试了它,它可以工作:-),但你只是忘记了做我警告的事情:在你的
{%
%}
中放置连字符(看我的例子)。或者在一行中执行
{%macro state(name)%}{{constant('App\\DealBundle\\Entity\\Deal::Deal\u state\uu'~name)}}{%endmacro%}
以避免空格问题。不,我没有忘记。我甚至像你说的那样在一行中测试了它。但还是有同样的错误:(你能复制/粘贴到这里吗?你的Symfony2版本是什么?Symfony2.1。也许是这样的?Marco和它的用法看起来和你的一字不差。
{% if logRecord.status == localMacros.state('MONEY_RESERVED') %}