Twig模板for循环内使用switch标签触发语法错误该如何解决?
错误成因
- 原生Twig核心默认不支持
{% switch %}/{% case %}语法,该语法属于可选扩展功能。未安装启用对应扩展时,Twig解析器无法识别switch标签,会错误判定外层for循环标签未正常闭合,触发语法报错。 - 代码自身存在两处语法问题也会干扰解析逻辑:
- textarea标签未正确闭合,代码中仅写了
</textarea,缺少末尾的> - 表格行标签使用错误,
<tr>打开后未写闭合标签</tr>,反而多了一个新的<tr>开启标签,同时调试用pre标签直接放在tbody内不符合HTML结构规范,进一步提升了解析报错概率。
- textarea标签未正确闭合,代码中仅写了
解决办法
方案1:替换为原生支持的if分支结构(无需额外安装扩展,推荐)
将switch分支直接替换为Twig原生兼容的{% if %}/{% elseif %}结构,修正后的代码如下:
<h1>{{title}}</h1> <div class="container"> {% for section, setting_data in settings %} <h4>{{section|title}}</h4> <table class="table"> <thead> <th>Name</th> <th>Value</th> </thead> <tbody> {% for setting_name, setting in setting_data %} <tr> <td>{{setting_name}}</td> <td> {% if setting.display_type == constant('\\Settings::DISPLAY_INPUT') %} <input type="text" name="settings[{{setting.setting_id}}]" value="{{setting.value}}" /> {% elseif setting.display_type == constant('\\Settings::DISPLAY_CHECKBOX') %} <input type="hidden" name="settings[{{setting.setting_id}}]" value="" /> <input type="checkbox" name="settings[{{setting.setting_id}}]" value="1" {%if setting.value=="Y"%}checked="checked"{%endif%} /> {% elseif setting.display_type == constant('\\Settings::DISPLAY_TEXT') %} <textarea name="settings[{{setting.setting_id}}]">{{setting.value}}</textarea> {% endif %} </td> </tr> <tr> <td colspan="2"> <pre>section={{section}}, setting_name={{setting_name}}, setting:{{name}}={{setting.value}}</pre> </td> </tr> {%endfor%} </tbody> </table> {%endfor%} </div>
方案2:安装启用Switch扩展
如果你希望继续使用switch语法,可按照以下步骤操作:
- 用composer安装Twig扩展包:
composer require twig/extensions - 在你的项目Twig环境初始化代码中,注册Switch扩展:
$twig->addExtension(new \Twig\Extensions\SwitchExtension()); - 修正代码中textarea闭合、tr标签结构的问题即可正常运行。
内容的提问来源于stack exchange,提问作者Tbirnseth
相关产品推荐
相关产品推荐

