Symfony2模版引擎使用说明手册

一、基本使用

{{ 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>

时间: 2024-10-14 12:31:20

Symfony2模版引擎使用说明手册的相关文章

PHP模版引擎 – Twig

在网站开发过程中模版引擎是必不可少的,PHP中用的最多的当属Smarty了.目前公司系统也是用的Smarty,如果要新增一个页面只需把网站的头.尾和左侧公共部分通过Smarty的include方式引入进来,然后主体部分写内容即可,用起来也是相当方便.这也是一种比较通用的做法.但维护一段时间后发现有些凌乱了: 1. 公共部分内容越加越多了,不需要用的js.css在一些页面也被强制引进来了 2.新页面的css只能写在网页的body内,看起来总让人不爽. 3.左侧.头部.尾部若有特殊显示,操作起来不方

如何在前端模版引擎开发中避免使用eval函数

前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用.于是根据自己对模版引擎的理解,定义自己的模版格式,然后,根据自己定义的格式,编写处理函数,将模版标签中的字符串,解析成可执行的字符串,然后再用eval函数执行该可执行的字符串. 然后问题就出现了!eval等价于evil! 为什么呢?各大js权威书籍上都不提倡使用eval.下面我详细的解释一下为什么不提倡. 首先,大家需要知道,js并不是一门解释型语言.它和其他大家熟知的编程语言(c,java,c++)一样,是编译型语言.但是

前端数据模版引擎的总结

模板的工作原理可以简单地分成两个步骤:模板解析(翻译)和数据渲染.这两个步骤可分别部署在前端或后端来执行.如果放在后端执行,则是像Smarty,FreeMarker这样的后端模板引擎,而如果放在前端来执行,则是我们要探讨的前端模板. FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板用servlet提供的数据动态地生成 HTML,模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度.这里不再对后端模版进行描述. 前端模版提高了前端开发

Express模版引擎hbs备忘

最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的概念) 支持模版继承(extend) 前后端共用 有容错处理(最好定位到具体出错位置) 支持预编译(性能好) 注意到hbs,似乎满足大部分的需求:https://github.com/donpark/hbs getting started demo地址:https://github.com/chyi

Spring整合Velocity模版引擎

1. 首先通过pom.xml自动加载velocity扩展包到工程: 1 <dependency> 2 <groupId>velocity</groupId> 3 <artifactId>velocity</artifactId> 4 <version>1.5</version> 5 </dependency> 2. 然后在自动装载bean的xml里边添加如下配置: 1 <bean id="vel

【转】T4模版引擎之基础入门

额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又在背后默默无闻的奉献着,直到现在我们项目组的人除了我之外,其它人还是对其豪无兴趣,基本上是连看一眼都懒得看,可怜的娃啊... T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件. 在 Visual C# 或 Visual

laravel 模版引擎使用

laravel 模版引擎以 @标签 开头,以 @end标签 结尾,常用有 foreach foreachelse if for while等 1)foreach 和 foreachelse 差不到,区别就是 foreachelse 还有一个@empty 分支,当循环的变量为空时执行 @foreach ($obj as $key=>$value) {{--循环体--}} @endforeach @foreachelse ($obj as $key=>$value) {{--循环体--}} @em

Java模版引擎velocity的使用

前言 关于velocity与SpringMVC的配置请参考前一篇文章,此处不再介绍.velocity作为Java模版引擎的主要目的是为了允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象.在velocity文件中可以给该页面指定模版布局,从而节省了大量的时间去写通用的模版布局.可以定义变量,与Java方法进行交互. 定义一个layout模版 在上一篇文章中提到了配置默认模版,当然也可以不使用默认模版即在要用到的页面的最上端写上 #set($layout='layout/yourl

使用模版引擎填充重复dom元素

引入arttemplate,定义newajax发送跨域请求获得数据,将获得的数据用定义的格式渲染 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery.js"></script> <scrip