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 放在任何地方?的主要内容,如果未能解决你的问题,请参考以下文章