前面2篇介绍了《为模版设计师而生的Twig》,已经暂停了很久没有进行翻译了。接下来继续介绍《为开发者而生的Twig》,因为内容较长,所以也分为两部分,本文为第一部分。这一章主要是介绍Twig的API,而不是模板语言。这将是实现应用程序的模板接口的开发者最有用的参考,对于创造Twig模板的人则意义有限。


1. Basics (基础知识)

Twig使用一个叫做environment(环境,Twig_Environment类的实例)的核心对象。这个类的实例被用于存储配置和扩展,以及从文件系统或其他位置加载模板。

大多数应用在程序初始化的时候会创建一个Twig_Environment对象,并使用它来加载模板。在某些情况下,如果有多个环境并行,并且不同的配置都在使用,那么这会很有用。

通过配置Twig来为你的应用程序加载模板的最简单的方法,看起来大致是这样的:

require_once '/path/to/lib/Twig/Autoloader.php';
Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array('cache' => '/path/to/compilation_cache',));

这将使用默认设置创建一个模板environment(环境)和一个查找 /path/to/templates/ 目录下的模板的加载器。不同的加载器是同时可用的,如果你想要从数据库或其他资源加载模板,你也可以自己编写一个。

提示:注意environment的第二个参数是一个数组选项。cache 选项是编译缓存目录,即Twig缓存已经编译的模板,用于避免后续请求的解析。这可能和你想要添加到缓存的估算模板有很大的不同。对于这样的需求,你可以使用任何可用的PHP缓存库。

要从这个 environment 中加载模板,你只需要调用 loadTemplate() 方法,然后它返回一个Twig_Template实例:

$template = $twig->loadTemplate('index.html');

为了使用一些变量渲染模板,可以调用 render() 方法:

echo $template->render(array('the' => 'variables', 'go' => 'here'));

提示: display() 方法是直接输出模板的快捷方式。

你还可以一举加载和渲染模板:

echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here'));


2. Environment Options (环境变量的选项)

当创建一个新的Twig_Environment实例时,你可以传递一个options数组作为构造函数的第二个参数:

$twig = new Twig_Environment($loader, array('debug' => true));

以下是可用的选项:

debug boolean

如果设置为true,生成的模板有一个__toString()方法,你可以用它来显示生成的节点(默认为false)。

charset string (默认是 `utf-8`)

模板使用的字符集。

base_template_class sting (默认是 `Twig_Template`)

基本模板类,以用于生成模板。

cache string|false

加载编译后的模板(缓存模板)的绝对路径, 如果设成false,则禁用缓存缓存(默认是false)。

auto_reload boolean

当你使用Twig进行开发,这会非常有用,因为代码改变的时候会重新编译模板。如果您没有提供auto_reload选项的值,它会根据debug的值自动判断。

strict_variables boolean

如果设成false,Twig会悄悄忽略掉非法的变量(包括不存在的变量、属性、方法)并使用null值替代他们(默认是false)。当设成true,Twig则会抛出一个异常。

autoescape string|boolean

如果设成true,HTML自动转义功能将会默认为所有模板开启(默认是true)。

Twig 1.8中,你可以使用(html, js, false)作为转义策略(false是禁用转义功能)。

Twig 1.9中,你可以使用(css, url, html_attr,或PHP回调函数)作为转义策略。

(这里的PHP回调函数,要能够通过模板的文件名返回一个转义策略。并且这个回调函数不能和内建的转义策略的函数名冲突。)

Twig 1.17中, 文件名转义策略确定了一个模板要使用的转义策略取决于它的模板文件名扩展。

(这个策略并不会在运行时产生任何开销,因为在编译的时候自动转义就已经完成了。)

optimizations integer

一个指示要使用那种优化方式的标志(默认是:-1,启用所有优化; 设为0的话,就是禁用)。

3. Loaders (加载器)

加载器负责从一个资源(如:文件系统)中加载模板。

3.1 Compilation Cache(编译缓存)

所有的模板加载器都可以在文件系统中缓存编译后的模板,以供将来可以重用。因为模板只需要编译一次,这使得Twig变得很快!并且如果你使用PHP加速器(如APC)的话,性能的提升将会更大。关于 Twig_Environment 的 cache 和 auto_reload 选项的更懂信息请参照上面的内容。

3.2 Built-in Loaders(内建加载器)

这是Twig提供的内建加载器的列表:

Twig_Loader_Filesystem (文件系统加载器)

1.10版中新增了 prependPath() 方法和对命名空间的支持。

Twig_Loader_Filesystem从文件系统中加载模板。该加载器可以在文件系统上的文件夹找到模板,并且这是加载他们的首选方法:

$loader = new Twig_Loader_Filesystem($templateDir);

它也可以寻找目录数组中的模板:

$loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2));

在这样的配置下,Twig将首先在$templateDir1查找模板,如果它们不存在,它会回退到$templateDir2继续寻找。

您可以通过 addPath()方法和 prependPath() 添加或预先准备的路径:

$loader->addPath($templateDir3);
$loader->prependPath($templateDir4);

这个文件系统加载器也支持名称空间的模板。这允许你将不同路径下的模板使用不同的命名空间给模板进行分组。

当使用 setPaths()、addPath()、prependPath() 方法的时候,请指定命名空间作为第二个参数(如果没有指定,这些方法将作用于“main”这个命名空间):

$loader->addPath($templateDir, 'admin');

命名空间的模板,可以通过特殊的符号 @namespace_name/template_path 来访问:

$twig->render('@admin/index.html', array());

Twig_Loader_Array(数组加载器)

Twig_Loader_Array从一个PHP数组加载模板。它传递一个字符串数组,数组的key作为模板名称和字符串进行绑定:

$loader = new Twig_Loader_Array(array('index.html' => 'Hello {{ name }}!',
));
$twig = new Twig_Environment($loader);
echo $twig->render('index.html', array('name' => 'Fabien'));

这个加载器对单元测试非常有用。它也可以用于把所有模板存储在一个单一PHP文件的小项目中,这可能是明智之举。

提示:当使用数组或字符串加载器作为缓存机制时,你应该知道,每次模板内容变化时一个新的cache key会被生产。(這里的cache key是模板源代码的cache key。)。如果你不想看到你的缓存失控增长,你需要自己负责清除旧的缓存文件。

Twig_Loader_Chain (链加载器)

Twig_Loader_Chain 代表加载的模板,用于其他加载器:
$loader1 = new Twig_Loader_Array(array('base.html' => '{% block content %}{% endblock %}',
));
$loader2 = new Twig_Loader_Array(array('index.html' => '{% extends "base.html" %}{% block content %}Hello {{ name }}{% endblock %}','base.html'  => 'Will never be loaded',
));$loader = new Twig_Loader_Chain(array($loader1, $loader2));
$twig = new Twig_Environment($loader);

当寻找一个模板时,Twig会依次尝试每个加载器,一旦发现模板会尽快返回。

从上面的例子中,当渲染 index.html 模板时,Twig会从$loader2加载它,而 base.html 模板时则将会从 $loader1 被加载。

提示:你也可以通过 addLoader() 方法添加加载器。

3.3 Create your own Loader(创建你自己的加载器)

所有的加载器都是Twig_LoaderInterface接口的实现:

interface Twig_LoaderInterface
{/*** Gets the source code of a template, given its name.** @param  string $name string The name of the template to load** @return string The template source code*/function getSource($name);/*** Gets the cache key to use for the cache for a given template name.** @param  string $name string The name of the template to load** @return string The cache key*/function getCacheKey($name);/*** Returns true if the template is still fresh.** @param string    $name The template name* @param timestamp $time The last modification time of the cached template*/function isFresh($name, $time);
}

如果当前缓存的模板是新的,那么 isFresh() 方法必须返回true,否则的话应该返回最后修改时间或false。

提示:在Twig 1.11.0中,当你使用链加载器时,可以从Twig_ExistsLoaderInterface的实现更快的创建你的加载器。

下篇将从 Using Extensions 继续翻译,敬请期待。

原文:为开发者而生的Twig(上)-Twig使用指南  http://loiy.net/post/1051.html

转载于:https://my.oschina.net/veekit/blog/518001

为开发者而生的Twig(上)-Twig使用指南相关推荐

  1. 【报告分享】2021年网生代线上社交行为洞察报告:95后、00后社交江湖大揭秘.pdf(附下载链接)...

    大家好,我是文文(微信:sscbg2020),今天给大家分享TT语音和Mob研究院于2021年5月份联合发布的报告<2021年网生代线上社交行为洞察报告:95后.00后社交江湖大揭秘.pdf&g ...

  2. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的"弱"和"慢">,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文 ...

  3. 「开发者说」车辆管理上钉钉,云上管车小程序开发分享

    本篇文章的供稿人为云上管车研发工程师刘奇云,内容主要为钉钉小程序开发相关,概览本文大概需要3分钟,精读本文需要10分钟 "随着经济社会数字化发展水平的提升,协同办公日趋常态化.云上管车通过与 ...

  4. 入门VR游戏开发者在Unreal Engine 4上开始VR设计所需要知道的

    入门VR游戏开发者在Unreal Engine 4上开始VR设计所需要知道的 游戏开发者 VR2048(vr2048) · 2016-01-12 18:38 首先,不要被标题吓到,这其实是一篇面向游戏 ...

  5. SWFUpload多文件上传使用指南

    SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在项目中用过几次,但它的配置参数太多了,用过后就忘记怎么用了,到以后要用时又得到官网上看它的文档,真是太烦了.所以 ...

  6. 掌上游戏机开发指南GBA探索日记(9)(转)

    掌上游戏机开发指南GBA探索日记(9)(转)[@more@] 这一节我们讨论如何正常结束声音播放的问题.不要觉得这是个小问题,当初这个小问题难倒了我们所有研究GBA的爱好者.我总觉得这一点似乎是GBA ...

  7. twig php,Twig模板引擎用法入门教程

    本文实例讲述了Twig模板引擎用法.分享给大家供大家参考,具体如下: 介绍 Twig是一个灵活.高效并且安全的PHP模板引擎. 如果你使用过Smarty.Django或者Jinja这类基于文本的模板引 ...

  8. java 日志乱码_【开发者成长】JAVA 线上故障排查完整套路!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以 ...

  9. linux 内存溢出排查_【开发者成长】JAVA 线上故障排查完整套路!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以 ...

最新文章

  1. 用!important解决IE和Mozilla的布局差别(转)
  2. ISA2006标准版配置导入企业版
  3. 云拨测助力节卡机器人 全面优化海外网站性能
  4. java数组写入excel_求将java中数组内容逐条加进excel中的代码
  5. mariadb mysql 5.6_MySQL 5.6 和 MariaDB-10.0 的性能比较测试
  6. JAVA入门: Annotation
  7. java try finally connectoin close_Java SocketChannel類代碼示例
  8. 回溯 皇后 算法笔记_算法笔记-回溯法
  9. thinkpad重装系统不引导_4个步骤,轻松解决电脑重装系统【蓝屏】
  10. hive 将null值替换为0_【Hive】数据倾斜
  11. python3中round的用法_Python 3标准库用法--reversed、round、set
  12. 231 · 自动补全
  13. paip.httpd.conf 是空的.txt
  14. 三菱PLC与上位机进行通讯
  15. App获取android分辨率,设计手机app界面时,常用的分辨率是多少
  16. 大起底神盾七号重疾险:赔两次价格还不贵,到底值不值?
  17. 修复iPhone8白屏的3种方法,可保留设备数据
  18. 博达网站服务器地址怎么查,路由器博达路由器配置经典教程
  19. AI相关领域期刊会议列表
  20. UVM概述及uvm_component和uvm_object(一)

热门文章

  1. 字符串的长度和字符串数据的长度,length和length()
  2. sed 注释行的 方法
  3. mysql Can‘t open and lock privilege tables: Table ‘.\mysql\db‘ is marked as crashed .. repair failed
  4. linux系统怎么远程进服务器
  5. mysql 根据身份证号码修改出生日期
  6. 计算机夯实基础学习顺序
  7. C++ Reference: Standard C++ Library reference: C Library: cstdio: vsnprintf
  8. 微信登录的openid和unionid区别
  9. python模拟鼠标 事件
  10. 核心频率个加速频率_今年前 9 个月全工序实现负能炼钢,本钢板材炼钢厂绿色清洁生产频率加快...