为啥还要用 Twig
PHP可以嵌入HTML,可以说本身就是模版语言,为啥还要用Twig这样的模版引擎?
首先,PHP可以嵌入HTML,但它首先是一种编程语言,这就意味着他对语法的要求很严格。比如,你在View中少写个分号会导致整个页面的崩溃,使用了模版引擎则不会。
安全性。如果允许用户自定义模版,那你就必须使用模版引擎,否则用户在模版中注入了攻击的PHP代码,呵呵,兄弟,你就等着哭吧。
跨语言。Twig和Jinja还有Django的模版规则几乎相同,Python开发者自然不会拒绝为你的系统开发模版。
模版功能更强大。可以自定义标签、过滤器、函数,支持Base语法。
IDE的支持。PHP的标签会影响HTML在IDE中的高亮显示,而Twig则不会。Vim和Textmate有Twig插件支持你快速的编写模版。
Twig 和 Codeigniter 整合
Codeigniter是一个PHP Framework,我一直使用他,没用过的请返回吧。下边的内容对你没有帮助。
Twig 和 Codeigniter 整合非常简单,仅仅两步即可完成
第一步,引入Twig库
下载Twig,解压Twig,将Twig源代码中的lib/Twig目录复制到CI的Application/third_party中,复制后的结果如下图
第二步,为Codeigniter创建Twig类
在Codeigniter的library目录中增加一个Twig.php文件,将如下代码粘贴进去
注意把APPPATH/cache目录设置为可写,twig会把编译后的模版放到这个目录中
:::PHP
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/*
* Created on 2013-10-25 by haojue
* Twig CI Library
*
*/
require_once APPPATH . 'third_party/Twig/Autoloader.php';
class Twig {
private $loader ;
private $twig;
private $_ci;
function __construct() {
Twig_Autoloader::register();
$this->loader = new Twig_Loader_Filesystem(APPPATH.'views');
$this->twig = new Twig_Environment($this->loader, array(
'cache' => APPPATH.'cache',
'auto_reload' => true
));
}
public function render($tpl,$data,$return = FALSE) {
$output = $this->twig->render($tpl,$data);
$this->_ci =& get_instance();
$this->_ci->output->append_output($output);
if ($return) {
return $output;
}
}
/**
* __call
* @param string $method
* @param array $args
* @throws Exception
*/
public function __call($method,$args) {
$return = call_user_func_array(array($this->twig,$method),$args);
if ($return) {
return $return;
}
}
}
在Codeigniter中使用Twig模版
:::PHP
class Test extends CI_Controller {
public function index()
{
$this->load->library('twig');
$this->twig->render('twig_template.html'); //模版文件放置在view目录中
}
}
为Twig添加函数
以下代码新建了一个CI的Helper,加载helper后,可以使用{{ base_url('something') }}获得base_url
:::PHP
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
if ( ! function_exists('twig_extend'))
{
function twig_extend()
{
$CI = & get_instance();
if ( ! $CI->twig instanceof Twig) {
log_message('error', "Twig library not initialized");
return;
}
$CI->load->helper('url');
$base_url = new Twig_SimpleFunction('base_url', 'base_url');
// Now you’ll be able to use {% raw %}{{ base_url('something') }}{% endraw %} in your
// template files, after you call this twig_extend() helper function
// in your controllers.
$CI->twig->addFunction($base_url);
}
}