在树枝中使用命名空间别名

时间:2013-04-19 22:42:05

标签: php symfony namespaces twig

我有一个代码可以检查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') %}

或者我总是需要写完整的班级名称?

3 个答案:

答案 0 :(得分:3)

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

所以解决方案就是下一个。您在模板中的某处声明:

    {% set namespace = 'App\\DealBundle\\Entity\\' %}

然后在另一个地方,您可以像这样使用它:

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

答案 1 :(得分:1)

您可以使用macro

{% macro state(name) -%}
   {{ constant('App\\DealBundle\\Entity\\Deal::DEAL_STATE_' ~ name) }}
{%- endmacro %}

并以这种方式使用它:

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

请勿忘记使用连字符( - )删除宏中的空格。

答案 2 :(得分:0)

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

@ alain-tiemblo的答案是对的,就像树枝不再认出_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') %}