一、基本使用
{{ demo }}输出一个demo变量;
{{% func %}}通常是包含一个twig函数例如 for;
举个for循环的例子:
{{% for i in 0..10 %}}
<em>{{ i }}</em>
{{% endfor %}}
当然也可以打印对象,例:
{{% for user in users %}}
<span>user.username</span>
{{% endfor %}}
注:users是从控制器中传来的对象参数
{{# #}}注释;
{{ demo | upper }} 将demo转化为大写,这是一个过滤器的例子;
二、模版继承
在app/Resources/views目录下默认会有一个base.html.twig
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %}{% endblock %} <link rel="icon" type="image/x-icon" href="{{ asset(‘favicon.ico‘) }}" /> </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html>
然后将自己的模版文件继承此
{% extends ‘::base.html.twig‘ %} {% block title %}My cool blog posts{% endblock %} {% block body %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
::base.html.twig表示此文件放在app/Resources/view目录下
注:{% extends %}必须放在第一行,当使用{% block body %}时,body这个块中所有都被覆盖,若想保留用parent()函数例:
{% block body %}
<h3>This is childContent</h3> ...
{{ parent() }}
{% endblock %}
三、模版不同命名方式的存储路径:
AcmeBlogBundle::layout.html.twig:这个语法指定了一个AcmeBlogBundle的基本模板。因为中间部分“controller”被忽略了(如Blog),模板路径位于AcmeBlogBundle中的Resources/views/layout.html.twig
::base.html.twig:这个语法指定了一个应用程序范围的模板或布局。注意该字符串由两个冒号(::)开始,意思是bundle和controller部分被忽略。这意味着该模板没有位于任何Bundle之中,因此它应该位于app/Resources/views/目录中
四、模版包含
(1)一个模版文件中包含另外的模版文件
{% include ‘AcmeArticleBundle:Article:articleDetails.html.twig‘ with {‘article‘: article} %}
如果with多个参数可以{‘foo‘:foo, ‘bar‘:bar}
(2)一个模版文件包含另外一个控制器的结果
{% render "AcmeArticleBundle:Article:recentArticles" with {‘max‘: 3} %}
注:两者区别在于include是将参数article传给了articleDetails.html.twig中的article参数,而render是将max参数传给了recntArticle这个控制器
五、其他帮助函数
(1)根据路由名生成url链接:
生成相对路径:<a href="{{ path(‘article_show‘, { ‘slug‘: article.slug }) }}">
生成绝对路劲:<a href="{{ url(‘homepage‘) }}">Home</a>
在php模版中用<a href="<?php echo $view[‘router‘]->generate(‘homepage‘, array(), true) ?>">Home</a>(symony1中是使用url_for)
(2)连接向css、js、iamge等资源:
<img src=\‘#\‘" asset(‘images/logo.png‘) }}" alt="Symfony!" />
<link href="{{ asset(‘css/blog.css‘) }}" rel="stylesheet" type="text/css" />
引:asset函数的主要目的是将你的应用程序更容易移植。如果你的应用程序在你主机的根目录下(如:http://example.com),然后被渲染的路径将是/images/logo.png。但如果你的应用程序是在子目录下(如:http://example.com/my_app),每个asset路径都将渲染成带子目录的(如:/my_app/images/logo.png)。asset函数要小心这一点,决定如何使用你的应用程序并并据此生成正确的路径
(3)配置和使用模版引擎:
配置和使用模板服务
在Symfony2中模板系统的核心是模板引擎。这个特定的对象负责渲染模板并返回它的内容。当你在控制器中渲染一个模板时,举个例子,你其实是在使用模板引擎服务。如:
return $this->render(‘AcmeArticleBundle:Article:index.html.twig‘);
等同于
$engine = $this->container->get(‘templating‘); $content = $engine->render(‘AcmeArticleBundle:Article:index.html.twig‘); return $response = new Response($content);
模板引擎(或“服务”)被预配置成在Symfony2中自动工作。当然它可以在应用程序配置文件中配置。
# app/config/config.yml framework: # ... templating: { engines: [‘twig‘] }
六、模版复写
Symfony2总是先查找位于app/Resources/BUNDLE_NAME/views/目录的模板。如果该模板不存在,它将继续在Bundle自己内部的Resources/views目录中查找。所以可以将模版文件写在app/Resources/BUNDLE_NAME/views/目录下来覆盖Bundle自己内部的Resources/views目录下的模版文件。
因为Symfony2框架自身也是一个Bundle,核心模板也可以用同样的方式覆写。举个例子,核心的FrameworkBundle包含着大量的“异常”和“错误”模板。要覆写它们,可以将它们从FrameworkBundle的Resources/views/Exception目录中拷贝到,正如你所想,app/Resources/FrameworkBundle/views/Exception目录中。(这个比较实用)
七、输出转义
为了防止XSS攻击需要转义输出,在symfony2 Twig模版引擎中输出转义是默认开启的,php模版引擎不开启
在某些案例中,当正在渲染一个被信任变量和不能被清理的标识时,你需要取消输出清理。假设管理用户可以写包含HTML代码的文章。缺省状态下,Twig将清理文章内容。要正常地渲染它,添加raw过滤器:{{ article.body | raw }}。
为了创建包含格式参数的链接,在参数的哈希数组中包括_format关键词:
<a href="{{ path(‘article_show‘, {‘id‘: 123, ‘_format‘: ‘pdf‘}) }}">This is PDF</a>