如何在Twig中有条件地扩展模板或导入宏

本文概述

  • 条件扩展
  • 条件宏
条件语句是程序员生活中的日常工作。条件语句是需要根据特定条件做出的决策:如果满足条件, 则将执行特定的代码段。谢谢队长明显。我为什么要说这么明显的话?好吧, 如果你想以明显的方式使用Twig, 而你想在某些视图上有条件地扩展布局, 例如使用if语句:
{# Example: THIS DOESN'T WORK #}{% set condition = true %}{# Check condition to see which layout to render #}{% if condition %}{% extends '::layout_1.html.twig' %}{% else %}{% extends '::layout_2.html.twig' %}{% endif %}

你将收到以下异常:
X行的YourBundle:yourfile.html.twig中禁止使用多个扩展标签。
因为如错误所述, 你不能在视图上两次使用extends标记。现在呢?可能你不想使用PHP向项目中添加更多逻辑来渲染某些模板, 因为你可以(或明确地需要)在视图中对其进行验证, 因此对你很有帮助, 可以有条件地扩展模板, 但不是你期望的那样。由于父级的模板名称可以是任何有效的Twig表达式, 因此可以使用类似语法的速记来使继承机制成为条件。
条件扩展为了理解它是如何工作的, 我们将与PHP进行类比。下面的函数showText
< ?phpfunction showText($text){echo $text; }

要调用它, 我们将只发送一个字符串作为第一个参数:
< ?php// Displays Hello WorldshowText("Hello World");

如果要根据条件显示一些文本, 则可以执行以下操作:
< ?php$todayWillRain = true; if($todayWillRain){showText("Today will rain"); }else{showText("There will be a lot of sun"); }

但这是一件简单的事情, 需要编写大量代码, 因此, 许多开发人员想写一个简写分配:
< ?php$todayWillRain = true; // If today rains, it will show "Today will rain", otherwise "There will be a lot of sun"showText(($todayWillRain == true ? "Today will rain" : "There will be a lot of sun"));

这就是速记函数的功能。尽管该参数不在if语句内, 但如果在括号内, 则使用简写形式对其求值, 并且无论如何它都会返回一个字符串。用细枝翻译为extends函数, 将是:
{% extends (condition) ? ("template if its true") : ("template if its false") %}

这意味着你可以按照以下机制简单地根据视图中的条件扩展不同的布局:
{% set condition = true %}{# Using a boolean after the extends tag, allows you touse a shorthand if to render conditionally a layoutIn this case if the condition is true, then thelayout 1 will be rendered, otherwise the layout 2#}{% extends condition? '::layout_1.html.twig' : '::layout_2.html.twig' %}

条件宏与extends标签不同, 导入显然可以根据需要多次使用, 因此你仍然可以使用简单的if语句为宏分配一个宏:
{% set condition = true %}{# Conditional declaration of "tools" #}{% if condition%}{% import "Macros/macro1_prod.html.twig" as tools %}{% else%}{% import "Macros/macro2_dev.html.twig"as tools %}{% endif %}{# Use the macro as you need #}{{ tool.someToolInsideMacro() }}

但是, 如果你想使代码简单, 甜美, 简短, 可以使用条件扩展中提到的相同速记if语句, 有条件地将宏分配给工具:
{% set condition = true %}{% import condition ? "Macros/macro1_prod.html.twig" : "Macros/macro2_dev.html.twig" as tools%}{# Use the macro as you need #}{{ tool.someToolInsideMacro() }}

请记住, 条件应该返回(如每个if语句所期望的)布尔值, 即true或false。通常, 开发人员根据用户的角色使用is_granted方法来呈现自定义布局。
【如何在Twig中有条件地扩展模板或导入宏】编码愉快!

    推荐阅读