如何在Twig中同时检查变量已定义且为真值?
嘿,这个问题我之前也碰到过!Twig其实有更简洁的写法,不用自定义过滤器就能搞定,刚好和你PHP里的用法对应上~
首先说最常见的场景:如果你的Twig配置里strict_variables是false(这是绝大多数项目的默认设置),你完全可以直接写:
{% if someVar %} {# 这里是变量存在且为真值时的内容 #} {% endif %}
它的行为和PHP里的<?php if ($someVar): ?>几乎一模一样:
- 如果变量
someVar根本没定义,Twig会把它当作null处理,条件不成立 - 如果变量存在但属于「假值」(比如
0、null、空字符串''、false、空数组这些),条件也不成立 - 只有当变量存在且是「真值」时,才会执行if块里的内容
那如果你的项目开启了strict_variables: true(这种模式下访问未定义变量会直接抛出异常),直接写{% if someVar %}就会报错,这时候有两种简洁的替代方案:
- 用
default过滤器兜底:
这个过滤器会在变量未定义或为{% if someVar|default(false) %} {# 逻辑和之前一致,还不会因为变量未定义报错 #} {% endif %}null时返回你指定的默认值(这里是false),完美规避了严格模式下的异常问题。 - 自定义Twig测试(如果你频繁需要这个逻辑):
你可以在PHP代码里注册一个自定义测试,比如:
之后在模板里就能写成:$twig->addTest(new \Twig\TwigTest('truthy', function ($value) { return !empty($value); }));
不过要注意,在严格模式下,还是得确保变量要么定义了,要么结合{% if someVar is truthy %} {# 这里执行逻辑 #} {% endif %}default用,不然还是会报错——所以其实第一种default的方案更省心。
总的来说,绝大多数情况下,直接写{% if someVar %}就足够替代你PHP里的写法,不用写那串冗长的is defined and someVar啦~
内容的提问来源于stack exchange,提问作者The_Unknown




