Twig 中是不是有任何方法可以确定方法/参数是不是存在而不将 if 放在任何地方?

Posted

技术标签:

【中文标题】Twig 中是不是有任何方法可以确定方法/参数是不是存在而不将 if 放在任何地方?【英文标题】:Is there any way in Twig to determine if a method/parameter exists without putting ifs everywhere?Twig 中是否有任何方法可以确定方法/参数是否存在而不将 if 放在任何地方? 【发布时间】:2015-05-23 05:30:34 【问题描述】:

当同时使用 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】:

纯 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 开发人员应该考虑提供“一般变量默认值”选项 :-)

【讨论】:

原来 Twig 是开源的,我们是 Twig 的开发者... facepalm

以上是关于Twig 中是不是有任何方法可以确定方法/参数是不是存在而不将 if 放在任何地方?的主要内容,如果未能解决你的问题,请参考以下文章

简单检查表单字段在 Twig 模板中是不是有错误

有啥方法可以确定包在 Oracle 中是不是有状态?

检查实体字段类型是不是在 Twig 中返回值

使用 Twig 生成纯 JSON 响应是不是合适?

如何确定当前在 ASP.Net 中是不是有任何文件正在上传?

在 PrepareStatement 中设置参数是不是有任何基于通用的替代方法