Twig介绍
TWIG 模板的主要特性
高效:Twig将模板编译成了优化了的PHP文件,与原生的PHP代码比较而言,性能损耗非常小。
安全:Twig使用沙箱(sandbox)模式去运行模板中不被信任的代码。这使得我们可以选择Twig作为那些允许用 户修改模板的应用的模板引擎。
灵活:Twig具有灵活的语法分析器和语法解析器,它允许开发人员定义自己的标签(tags)和过滤器(filters),并且创建自己的领域特定语言(DSL,domain specific language)。
可用符号:
== != < > >= <= + - ~ / // % * | [] . .. and or not in is b-and b-or b-xor
部分运算符的含义:
1、 ~ ://连接两个字符串,相当于php中的点号
2、// ://整除
3、** ://乘方
4、b-and、b-or、b-xor:按位与、按位或、按位异或
5、- ://减法以及去除空白的简写用法 {%- xxxx -%} //去除两边的空白
注释:
{# 注释内容 #}
数组遍历
按数组value遍历:
{% for value in foo %}
{ { value }}
{% endfor %}
按数组key遍历:
{% for key in foo|keys %}
{{ key }}
{% endfor %}
按key,value遍历:
{% for key, value in foo %}
{{ key }}:{{ value }}
{% endfor %}
如果 foo 非数组,还可以使用else语句,如:
{% for key, value in foo %}
{{ key }}:{{ value }}
{% else %}
foo is Not a Array
{% endfor %}
也可以直接带条件,遍历二维数组时比较有用,可用value.field来判断:
{% for key, value in foo if value == 1 %}
{{ key }}:{{ value }}
{% endfor %}
循环体内部变量:
loop.index 循环的次数(从1开始)
loop.index0 循环的次数(从0开始)
loop.revindex 循环剩余次数(最小值为1)
loop.revindex0 循环剩余次数(最小值为0)
loop.first 当第一次循环的时候返回true
loop.last 当最后一次循环的时候返回true
loop.length 循环的总数
loop.parent 被循环的数组
条件语句:
需要使用 or 和 and 代替 ||、&&
{% if a == '1' or b == '2' %}
a = 1 or b = 2
{% endif %}
判断变量是否定义
{% if var is not defined %}
do something
{% endif %}
是否为NULL
{% if var is null %}
do something
{% endif %}
是否为false
{% if var is sameas(false) %}
do something
{% endif %}
解析定界符
{{ '{{' }}
{% raw %}
<ul>
{% for item in seq %}
<li>{ { item }}</li>
{% endfor %}
</ul>
{% endraw %}
控制结构:##
{% macro %} XXX {% endmacro%} //定义宏以便多次调用,与定义php函数无异
{% block xxx %} 或 {% block %} xxx {% endblock %}//定义代码块或覆盖代码块,相当于占位符,当被另一个模板继承时,可以调用这个模块。
//定义时的内容在继承的模板中默认是不会出现的,可以使用 {{ parent() }} 来显示
{% import "macro.html.twig" as web_macro %} //导入宏模板macro.html.twig并设置别名为web_macro
{% from aaa import bbb as ccc %} //从指定的aaa模板导入宏bbb并设置别名为ccc
{% set aaa=bbb %} //在模板内定义变量
{% sqaceless %} {% endspaceless %} //去除html片段中的空格
{% autoescape %} //将字符串安全的处理成合法的指定数据(true 启用|false 禁用)
//相关用法
{% autoescape true %}
{{ var }} {# 将会以文本的形式输出 #}
{{ var|raw }} {# 将会以 html 标签的形式输出 #}
{{ var|escape }} {# 将会以文本的形式输出 #}
{% endautoescape %}
Twig在symfony中的使用
如何在Twig中通过app变量访问到User, Request, Session和更多对象
在每个请求中,Symfony将会在Twig引擎和PHP引擎默认设置一个全局模板变量app。该app变量是一个GlobalVariables实例,它将让你自动访问到程序一些特定的变量。比如:
app.user
表示当前用户对象,如果没有就是null。这个变量中存储的值,可以是一个UserInterface对象,任何实现了__toString()方法的对象,或者甚至是一个常规字符串。 object, any other object which implements a __toString() method or even a regular string.
app.request
这个Request 对象就是当前请求对象(取决于你的程序,它可能是一个子请求或者是一个常规请求,后面会解释)
app.session
这个Session对象表示当前用户的session,如果没有就是null。
app.environment
当前程序的环境名称(dev, prod, 等等).
app.debug
如果在debug模式下就是true,false则不是。
示例:
<p>Username: {{ app.user.username }}</p>
{% if app.debug %}
<p>Request method: {{ app.request.method }}</p>
<p>Application Environment: {{ app.environment }}</p>
{% endif %}
如何注入变量到所有的模板(全局Twig变量):
有时候,你希望变量能够进入你所使用的所有模板。在你的app/config/config.yml文件中设置就 可以做到:
# app/config/config.yml
twig:
# ...
globals:
ga_tracking: UA-xxxxx-x
现在,在所有的Twig模板中都可以使用ga_tracking 变量了:
<p>The google tracking code is: {{ ga_tracking }}</p>
使用服务容器参数:
你也可以利用内置的服务参数系统,他可以让你独立和重用这个值,这个相同的变量使用和以前一样。:
# app/config/parameters.yml
parameters:
ga_tracking: UA-xxxxx-x
# app/config/config.yml
twig:
globals:
ga_tracking: '%ga_tracking%'
引用服务:
除了使用静态值,您还可以将该值设置为服务。每当全局变量在模板中被访问,就从服务容器中请求服务,并获取该对象。
这个服务不会延迟加载。换句话说,当Twig一被加载,即使你从来都没使用过这个全局变量,您的服务也会被实例化。
要定义一个服务为全局Twig变量,字符串前缀应该为@。这应该感到熟悉,因为你在服务容器中也使用相同的语法。
# app/config/config.yml
twig:
# ...
globals:
user_management: '@app.user_management'