有没有办法在Twig中确定方法/参数是否存在而不在任何地方放置ifs?

时间:2015-03-19 22:01:24

标签: symfony twig

一起使用Symfony2和Twig时,如果需要这样做:

<td>{{ myObject.method.parameter }}</td>

或只是

<td>{{ myObject.parameter }}</td>

如果未设置twig文件尝试访问的内容,则会引发错误。 除了在任何地方写这个之外,是否有一种更清洁的方法来防止这种情况:

<td>{% if myObject.method.parameter is defined %}{{ myObject.method.parameter }}{% endif %}</td>

最近与Angular合作非常好,因为它似乎并不关心。

1 个答案:

答案 0 :(得分:4)

纯Twig解决方案是使用default过滤器:

http://twig.sensiolabs.org/doc/filters/default.html

它看起来像这样,对我来说很好用:

{{ myObject.it.is.not.designed|default('it is not defined') }}  

默认文本可以是空字符串''

现在您必须为每个变量设置默认值。与{% autoescape %}不同,似乎无法为更大的代码区域定义过滤器。为了简单起见,我将创建一个宏:

{% macro safeEcho(value) %}
  {{ value | default('') }}
{% endmacro %}

不要忘记导入:

{% import _self as helper %}

测试:

Test:{{ helper.safeEcho(echolabels.something.something_2) }}

如果我经常使用这个,我会考虑短名称,虽然我通常不使用缩写:h.se()

有关宏的更多信息:

http://twig.sensiolabs.org/doc/tags/macro.html

如果从根本上需要这个,可能有可能覆盖Twig词法分析器:

http://twig.sensiolabs.org/doc/internals.html

我不知道Twig是Symfony2的一部分。可能是它的配置提供了另一种选择:

http://symfony.com/doc/current/reference/configuration/twig.html

最后,请看这个问题之前有过不同的答案。

How to check for null in Twig?

symfony, twig - default filter for all variables in template

也许Twig开发人员应考虑提供“常规变量默认”选项: - )