在PHP中,我可以做到
<?php if ($someVar): ?>
检查变量是否存在和,如果它的值与类似零的值不同,如0,null,&#39;&#39;等等。
有没有办法在Twig中这样做,还是我需要为此编写自己的过滤器?目前,我必须做
{% if someVar is defined and someVar %}
对于更复杂的模板而言,这是一种痛苦。
答案 0 :(得分:4)
在没有扩展Twig的情况下,至少有两种方法可以做到这一点。第三种选择是通过创建例如Twig来扩展Twig。一个Twig功能。我可能会选择第一种方式(使用r = requests.post('http://.../', json=m)
过滤器)。
default
过滤器正如@The_Unknown指出的那样,你也可以使用default
filter:
default
您可以省略将默认值传递给过滤器,甚至省略括号。然后该值将默认为空字符串(这是假的)。即这两个是平等和有效的:
{% if someVar|default(null) %}
无论你选择哪种风格(默认为{% if someVar|default() %}
{% if someVar|default %}
,省略值或省略parens),坚持下去。保持一致。
See TwigFiddle有关truthy值评估为null
且falsey值评估为true
的演示(基于下表)。
false
设为strict_variables
通过将环境变量false
设置为strict_variables
,您可以跳过false
部分,只执行if someVar is defined
。如Twig's documentation:
{% if someVar %}
布尔如果设置为
strict_variables
,Twig将默默忽略无效变量 (变量和/或不存在的属性/方法)和替换 它们的值为false
。设置为null
时,Twig会抛出异常 相反(默认为true
)。
创建false
实例时,将变量设置为false
:
Twig_Environment
如果$twig = new Twig_Environment($loader, ['strict_variables' => false]);
未定义,则someVar
显然是{% if someVar %}
。 The if
tag's documentation page描述了已定义变量的边缘情况规则:
确定表达式
false
或true
的规则是相同的 就像PHP一样;这是边缘案例规则:Value Boolean evaluation empty string false numeric zero false whitespace-only string true empty array false null false non-empty array true object true
See TwigFiddle进行演示(false
设置为strict_variables
后面的&#34;更多选项...&#34;标题中的链接。)
(免责声明:我在@The_Unknown指出也可以使用false
过滤器之前写过这种方法。)
如果将default
设置为strict_variables
的想法过于笼统,您也可以扩展Twig。我认为将false
设置为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)
置于return语句之上以自行查看。)
如果您希望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
期望第一个参数是字符串或整数。