Twigを試す
きっかけ
はてブでテンプレートエンジンを素のPHPからTwigに乗り換えた理由 - id:anatooのブログを見たのがきっかけ。
PHPで使ったことのあるテンプレートエンジンは、FastTemplate, SmartyとZend_View*1。
準備
Twigのダウンロード
Error - Twig - The flexible, fast, and secure PHP template engineで、tar archiveをダウンロード。
php5のインストール
先日vmwareにインストールしたubuntuで試すため、php5をインストール。
ちなみに、TwigはPHP-5.2.4以降でなければ利用できない。
$ sudo aptitude install php5 php5-cli
サンプル
ファイル構成
./cache/ ./lib/fabpot-Twig-ca75922/ ./sample01.php ./template/sample01.html
テンプレート
<html> <title>{{ title }}</title> </html> <body> Hello {{ name }}!! </body>
プログラム
<?php // sample01.php require_once './lib/fabpot-Twig-ca75922/lib/Twig/Autoloader.php'; Twig_Autoloader::register(); // loader $loader = new Twig_Loader_Filesystem('./template/'); // extension $escaper = new Twig_Extension_Escaper(true); // options $options = array('cache' => './cache/', 'debug' => true); $twig = new Twig_Environment($loader, $options); $twig->addExtension($escaper); $template = $twig->loadTemplate('sample01.html'); $context = array( 'title' => 'sample01', 'name' => 'twig', ); echo $template->render($context);
実行結果
$ php sample01.php <html> <title>sample01</title> </html> <body> Hello twig!! </body>
簡単な説明
- Twig_Environment, Twig_Loader, Twig_Exntension, Twig_Templateの4つからなる。
- Twig_Environmentは、Twigのかなめ。このオブジェクトでテンプレートをロードする。
- Twig_Loaderは、テンプレートをどのようにロードするか管理する。
- Twig_Exntensionは、Twigテンプレートを拡張するためのもの。
- Twig_Environmentでロードしたテンプレートは、Twig_Templateのオブジェクトとしてあつかう。
- Twig_Templateのrenderメソッドで、テンプレートを適用する。
Environment
オブジェクトを生成するときに、オプションが指定できる。
$options = array('cache' => './cache/', 'debug' => true); $twig = new Twig_Environment($loader, $options);
利用可能なオプションは以下。詳細は本家に。
- debug
- trim_blocks
- charset
- base_template_class
- cache
- auto_reload
一部のオプションは、0.9.3以降でなくなるらしい。
Loader
Twigが提供するLoaderは、以下の3つ。
Twig_Loader_Filesystemは、 指定したディレクトリ以下のファイルを用いる。上記のサンプルが利用例。
Twig_Loader_Stringは、与えた文字列をテンプレートとしてあつかう。
<?php // sample02.php require_once './lib/fabpot-Twig-ca75922/lib/Twig/Autoloader.php'; Twig_Autoloader::register(); $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate("Hello {{ name }}!\n"); $template->display(array('name' => 'Twig'));
$ php sample02.php Hello Twig! $ php
Twig_Loader_Arrayは、テンプレートして扱う文字列を配列で与える。ユニットテストでの利用を想定しているらしい。
<?php // sample03.php require_once './lib/fabpot-Twig-ca75922/lib/Twig/Autoloader.php'; Twig_Autoloader::register(); $templates = array('hello' => "Hello {{ name }}!\n"); $loader = new Twig_Loader_Array($templates); $twig = new Twig_Environment($loader); $template = $twig->loadTemplate('hello'); $template->display(array('name' => 'Twig'));
$ php sample03.php Hello Twig!
なお、Loaderは自作可能。
Extension
Twigが提供するExtensionは、以下の3つ。
- core
- TwigテンプレートのTwigタグ、フィルタなどを提供する。Twig_Environmentオブジェクトを作成した時点で自動的に登録される。
- escaper
- テンプレートに適用する値を自動的にエスケープする。また、エスケープ用のフィルタを提供する。
- sandbox
- Environtmentオブジェクトをsandbox化する。特定のTwigタグ、フィルタしか利用できない環境を提供できる。
escaperを登録する例
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);
// extensions
$escaper = new Twig_Extension_Escaper(true);
$twig->addExtension($escaper);
Extensionも自作可能。
あとは
Twigの面白いところは、元記事にもあるようにテンプレートの継承。
まだ、試せていないので、あとで試してまとめよう。
*1:Zend_ViewはあくまでViewであるが、テンプレートエンジンと同等の機能を持つ。