原文链接:https://www.drupal.org/node/1918824
本页面比较了PHP模板和Twig。Twig工具还在制作过程中,所以本文将会有改动和添加。
更多信息:
关于Twig
Twig是基于PHP编译的模板语言。当渲染你的网页时,Twig引擎接管模板并将其转化为编译的PHP模板,并存储在一个被保护的目录下sites/default/files/php_storage/… 编译被执行一次。模板文件将被缓存,或在清除Twig缓存后重新编译。
Drupal的Twig行动与Symfony行动有同样的目的: 采用一个现代的,强力的,基于OOP的引擎可以让开发者集中于Drupal本身
-
Docblock
PHP模板:
<?php /** * @file * File description */ ?>
Twig:
{# /** * @file * File description */ #}
-
文件和函数名:
PHP模板文件: node--article.tpl.php
Twig文件: node--article.html.twig
PHP模板函数: theme_node_links()
Twig函数: node-links.html.twig
-
变量
输出一个变量:
PHP模板:
<div class="content"><?php print $content; ?></div>
Twig:
<div class="content">{{ content }}</div>
输出一个hash key对象:
PHP模板:
<?php print $item['#item']['alt']; ?>
Twig:
{{ item['#item'].alt }}
分配变量:
PHP模板: <?php $custom_var = $content->comments; ?>
Twig:{% set custom_var = content.comments %}
分配数组:
PHP模板:
<?php $args = array('!author' => $author, '!date' => $created); ?>
Twig:
{% set args = {'!author': author, '!date': created} %}
-
条件
PHP模板:
<?php if ($content->comments): endif; ?>
Twig:
{% if content.comments %} {% endif %}
PHP模板:
<?php if (!empty($content->comments)): endif; ?>
Twig:
{% if content.comments is not empty %} {% endif %}
PHP模板:
<?php if (isset($content->comments)): endif; ?>
Twig:
{% if content.comments is defined %} {% endif %}
PHP模板:
<?php if ($count > 0): endif; ?>
Twig:
{% if count > 0 %} {% endif %}
-
控制结构
PHP模板: <?php foreach ($users as $user) {} ?>
Twig:{% for user in users %} {% endfor %}
-
过滤器
Check_plain:
PHP模板:
<?php print check_plain($title); ?>
Twig:
{{ title|striptags }}
翻译:
PHP模板:
<?php print t('Home'); ?>
Twig:
{{ 'Home'|t }}
有替代变量的翻译:
PHP模板:
<?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig:
{{ 'Welcome, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig (有翻译标签扩展):
{% set username = user.name %} {% trans %} Welcome, {{ username }} {% endtrans %}
展开列表:
PHP模板:
<?php echo implode(', ', $usernames); ?>
Twig:
{{ usernames | join(', ') }}
这个PHP模板的例子需要$usernames是一个字符数组。同样,原始的Twig例子中usernames也是一个字符数组。Drupal 8 Twig的例子则需要一个可渲染的对象。这个实际上是Drupal 8 Twig 和原始Twig的根本不同。Drupal 8 Twig 输出纯文本和可渲染数组。
这个例子的另一方面是3个例子被期待输出同样的结果,但是实际默认不是,看这个例子:
<?php {% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %} {{ numbers }} ?>
上面企图输出被逗号隔开的元素,但实际输出是:OneTwoThree。
异常:
PHP模板:
<?php echo check_plain($title); ?>
原始Twig:
{{ title|e }}
Drupal 8 Twig:
{{ title }}
-
空白控制
Twig拥有空白控制功能,它允许将建立模板文件的空白移除。
<div class="body"> {{- block.content -}} </div>
等同于:
<div class="body">{{ block.content }}</div>
注意
- Hash key元素的例子在未来可能改变
- 在第二个例子中,我们展示了Twig也会负责净化数据。此前,这是模板文件或预处理函数的事。这个最后的改变值得所有希望为Drupal 8制作PHP模板主题的人着重关注——你需要自己净化你的数据,所有。