检查Twig中是否定义了变量并立即执行

检查Twig中是否定义了变量并立即执行,twig,Twig,在PHP中,我可以 <?php if ($someVar): ?> 当涉及到更复杂的模板时,这是一种痛苦。在不扩展细枝的情况下,有(至少)两种方法可以做到这一点。第三个选项是通过创建例如细枝函数来扩展细枝。我可能会选择第一种方式(使用default过滤器) 通过使用默认值过滤器 正如@The_Unknown所指出的,您还可以使用: 可以忽略将默认值传递给过滤器,甚至忽略括号。然后该值将默认为空字符串(这是错误的)。也就是说,这两者是平等和有效的: {% if someVar|de

在PHP中,我可以

<?php if ($someVar): ?>
当涉及到更复杂的模板时,这是一种痛苦。

在不扩展细枝的情况下,有(至少)两种方法可以做到这一点。第三个选项是通过创建例如细枝函数来扩展细枝。我可能会选择第一种方式(使用
default
过滤器)


通过使用
默认值
过滤器 正如@The_Unknown所指出的,您还可以使用:

可以忽略将默认值传递给过滤器,甚至忽略括号。然后该值将默认为空字符串(这是错误的)。也就是说,这两者是平等和有效的:

{% if someVar|default() %}
{% if someVar|default %}
无论您选择哪种样式(默认为
null
,省略值或省略参数),都要坚持使用它。保持一致

演示truthy值的计算结果为
true
,falsey值的计算结果为
false
(基于下表)


通过将
strict\u变量设置为
false
通过将环境变量
strict\u variables
设置为
false
,如果定义了someVar,则可以跳过
部分,只执行
{%if someVar%}
。如中所述:

strict\u变量
boolean

如果设置为
false
,Twig将自动忽略无效变量 (不存在的变量和/或属性/方法)并替换 使用
null
值删除它们。当设置为
true
时,Twig抛出异常 相反(默认为
false

创建
Twig\u环境
实例时,将变量设置为
false

$twig = new Twig_Environment($loader, ['strict_variables' => false]);
如果
someVar
未定义,那么
{%If someVar%}
显然是
false
。描述定义变量的边缘大小写规则:

确定表达式是
true
还是
false
的规则相同 如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
['needs\u context'=>true]
部分在这里很重要,因为这样您就可以访问
$context
,它包含当前上下文中存在的变量。(例如,您可以将
var\u 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\u key\u exists
期望第一个参数是字符串或整数。

很有趣,但这样做似乎不是一个好主意:-)这是非常一般的。我同意最好将
严格的\u变量设置为
true
。我用另一种方法更新了我的答案。谢谢你的回答。但我怀疑,我找到了一个更简单的解决方案:{%if someVar | default()%}怎么样?它还适用于{%if someArray.property | default()%}等数组。还是我出了什么问题?经过快速测试后,它看起来也会起作用。您可以添加您自己的答案,或者我可以将其添加到我的答案中,并提供详细信息。没问题;-)谢谢你的支持!
$twig->addFunction(new Twig_Function('istruthy', function($context, $var) {
     return array_key_exists($var, $context) && $context[$var];
 }, ['needs_context' => true]));
$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]));
{% 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' }}