作業ノート

様々なまとめ、雑感など

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であるが、テンプレートエンジンと同等の機能を持つ。