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