本文概述
- 条件扩展
- 条件宏
{# 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中有条件地扩展模板或导入宏】编码愉快!
推荐阅读
- 如何在Symfony 3的Twig视图的Dates上使用time_diff和ago(time ago)函数
- 如何防止XSS攻击并禁止PHP Markdown解析器生成的HTML中的特定标签
- 解决方案错误(名称为”yourtable.tablename”的表已存在)
- 如何在Symfony 3上的控制器(带有或不带有FOSUserBundle)中手动验证(登录)用户
- 如何在WinForms C#中使用LiveCharts库创建地理图表(GeoHeatMap)
- 如何在Microsoft Visual Studio Code中禁用自动补全和智能感知
- 为什么我在android studio中调试时看不到代码()
- 如何在2020年成为一名Android开发人员[关闭]
- Android NDK。从.PVR文件加载ETC1压缩纹理