在Twig中使用命名空间别名

3

我有一段代码,它在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::DEAL_STATE_MONEY_RESERVED') %}

或者我总是需要编写完整的类名吗?

你总是需要编写完整的类名。你是否曾经考虑过创建一个Twig测试,这样你就可以像这样做:if logRecord.status is state('reserved') - Maerlyn
是的,你可以为此编写一个Twig函数。 - mpm
@Maerlyn 是的,我可能会为此制作一个自定义测试。谢谢! - ozahorulia
3个回答

4
我遇到了相同的问题,解决办法非常简单。这个宏在我们的情况下无法使用,因为我们不仅要将常量值用于呈现,还要用作值(int、string、float等)。这是不可能的,因为使用此宏时,Twig会将该值转换为Twig_Markup类。
因此,解决方案如下。在模板的某个位置声明:
    {% set namespace = 'App\\DealBundle\\Entity\\' %}

然后在另一个地方您可以像这样使用它:
    {% if logRecord.status is constant(namespace~'Deal::DEAL_STATE_MONEY_RESERVED') %}

1
您可以使用一个
{% macro state(name) -%}
   {{ constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_' ~ name) }}
{%- endmacro %}

使用方法如下:

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

不要忘记在宏中使用连字符(-)来删除空格。

哦不,它不工作了:“无法将Twig_Markup类的对象转换为int”。因此它返回的是一个宏对象,而不是它的值。 - ozahorulia
我测试过了,它可以正常工作 :-) 但你忘记做我警告过的事情了:在你的 {%%} 中加入连字符(看看我的例子)。或者将 {% macro state(name) %}{{ constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_' ~ name) }}{% endmacro %} 写成一行,以避免空格问题。 - Alain Tiemblo
不,我没有忘记。我甚至像你说的那样在一行中进行了测试。但仍然出现相同的错误 :( - ozahorulia
你能将它复制/粘贴在这里吗?你的Symfony2版本是什么? - Alain Tiemblo
Symfony 2.1。也许就是这样?Marco 和它的使用看起来与你的一模一样。 - ozahorulia

0

我更新这篇文章,以防有人和我遇到相同的问题,但不想使用任何特殊扩展。

@alain-tiemblo的答案是正确的,就像twig不再识别_self对象一样。所以唯一要做的就是导入它,如下:

{% 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') %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接