在 Twig 中立即检查变量是否已定义且为真

问题描述 投票:0回答:3

在 PHP 中我可以做到

<?php if ($someVar): ?>

这会检查变量是否存在它的值是否不同于 0、null、'' 等类似零的值。

在 Twig 中有什么方法可以做到这一点,还是我需要为此编写自己的过滤器?此刻,我必须做

{% if someVar is defined and someVar %}

当涉及到更复杂的模板时,这是一个痛苦。

twig
3个回答
24
投票

有(至少)两种方法可以在不扩展 Twig 的情况下做到这一点。第三种选择是通过创建例如扩展 Twig一个树枝功能。我可能会选择第一种方式(使用

default
过滤器)。


通过使用
default
过滤器

正如@The_Unknown 指出的那样,您还可以使用

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
布尔值

如果设置为

false
,Twig 将默默地忽略无效变量 (不存在的变量和/或属性/方法)并替换 他们具有
null
值。当设置为
true
时,Twig会抛出异常 相反(默认为
false
)。

创建

false
实例时设置变量为
Twig_Environment

$twig = new Twig_Environment($loader, ['strict_variables' => false]);

如果

someVar
没有定义,那么
{% if someVar %}
显然是
false
if
标签的文档页面
描述了定义变量的边缘情况规则:

判断一个表达式是

true
还是
false
的规则是一样的 和 PHP 一样;这是边缘案例规则:

Value 布尔值评估

空串假
数字零假
纯空格字符串 true
空数组 false
空假
非空数组 true
对象真实

请参阅 TwigFiddle 进行演示(

strict_variables
设置为
false
在标题中“更多选项...”链接后面)。


通过扩展 Twig

(免责声明:我在@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
期望第一个参数是字符串或整数。


5
投票

以下效果很好:

{% if someVar ?? false %}

0
投票

除了

@matias-kinnunen
@Sébastien
所说的之外,在文档 中写道,只有在使用布尔变量时,我们才必须使用
??
语法。否则,我们必须使用
default
过滤器。它对每个版本的 Twig(1.x、2.x、3.x)都有效。

© www.soinside.com 2019 - 2024. All rights reserved.