在 PHP 中我可以做到
<?php if ($someVar): ?>
这会检查变量是否存在和它的值是否不同于 0、null、'' 等类似零的值。
在 Twig 中有什么方法可以做到这一点,还是我需要为此编写自己的过滤器?此刻,我必须做
{% if someVar is defined and someVar %}
当涉及到更复杂的模板时,这是一个痛苦。
有(至少)两种方法可以在不扩展 Twig 的情况下做到这一点。第三种选择是通过创建例如扩展 Twig一个树枝功能。我可能会选择第一种方式(使用
default
过滤器)。
default
过滤器default
过滤器:
{% if someVar|default(null) %}
您可以省略将默认值传递给过滤器,甚至可以省略括号。然后该值将默认为空字符串(这是错误的)。 IE。这两个是相等且有效的:
{% if someVar|default() %}
{% if someVar|default %}
无论您选择哪种样式(默认为
null
,省略值或省略括号),请坚持使用。保持一致。
请参阅 TwigFiddle,了解真值评估为
true
和假值评估为 false
的演示(基于下表)。
strict_variables
设置为false
通过将环境变量
strict_variables
设置为false
,您可以跳过if someVar is defined
部分而只做{% if someVar %}
。如Twig 的文档中所述:
布尔值strict_variables
如果设置为
,Twig 将默默地忽略无效变量 (不存在的变量和/或属性/方法)并替换 他们具有false
值。当设置为null
时,Twig会抛出异常 相反(默认为true
)。false
创建
false
实例时设置变量为Twig_Environment
:
$twig = new Twig_Environment($loader, ['strict_variables' => false]);
如果
someVar
没有定义,那么{% if someVar %}
显然是false
。 if
标签的文档页面 描述了定义变量的边缘情况规则:
判断一个表达式是
还是true
的规则是一样的 和 PHP 一样;这是边缘案例规则:false
Value 布尔值评估 空串假 数字零假 纯空格字符串 true 空数组 false 空假 非空数组 true 对象真实
请参阅 TwigFiddle 进行演示(
strict_variables
设置为 false
在标题中“更多选项...”链接后面)。
(免责声明:我在@The_Unknown 指出也可以使用
default
过滤器之前写了这个方法。)
如果将
strict_variables
设置为false
的想法太笼统,你也可以扩展Twig。我认为最好将 strict_variables
设置为 true
以避免由例如引起的意外错误。变量名中的拼写错误,所以这种方法可能会更好。
我不认为你可以创建一个过滤器来做到这一点,因为一个未定义的变量仍然会抛出异常。您也许能够创建自定义标签、测试或扩展(有关扩展 Twig 的方法,请参阅Extending Twig);我将创建一个自定义函数,因为它可能是最简单的方法。
$twig->addFunction(new Twig_Function('istruthy', function($context, $var) {
return array_key_exists($var, $context) && $context[$var];
}, ['needs_context' => true]));
['needs_context' => true]
部分在这里是必不可少的,因为这样您就可以访问 $context
,其中包含当前上下文中存在的变量。 (例如,您可以将 var_dump($context)
放在返回语句上方以自己查看。)
如果你想让
istruthy
支持一次检查多个变量,你可以这样做:
$twig->addFunction(new Twig_Function('istruthy', function($context, ...$vars) {
foreach ($vars as $var) {
if (!array_key_exists($var, $context) || !$context[$var]) {
return false;
}
}
return true;
}, ['needs_context' => true]));
然后在 Twig 中你可以这样做:
{% if istruthy('foo') %} ... {% endif %}
{% if istruthy('foo') or istruthy('bar') %} ... {% endif %}
{# These two are the same: #}
{% if istruthy('foo') and istruthy('bar') and istruthy('baz') %} ... {% endif %}
{% if istruthy('foo', 'bar', 'baz') %} ... {% endif %}
{# Ternary operator can also be used: #}
{{ istruthy('foo') ? 'yep' : 'nope' }}
您可能想检查
istruthy
函数的参数是字符串还是其他内容,然后采取相应的行动。 array_key_exists
期望第一个参数是字符串或整数。
以下效果很好:
{% if someVar ?? false %}
除了
@matias-kinnunen
和 @Sébastien
所说的之外,在文档 中写道,只有在使用布尔变量时,我们才必须使用 ??
语法。否则,我们必须使用default
过滤器。它对每个版本的 Twig(1.x、2.x、3.x)都有效。