CodeIgniter 和 Twig 整合

2013-10-25

为啥还要用 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中,复制后的结果如下图 安装Twig

第二步,为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 {{ base_url('something') }} in your
   // template files, after you call this twig_extend() helper function
   // in your controllers.
   $CI->twig->addFunction($base_url);
  }
}

标签: CodeIgniter Twig