PHPテンプレートエンジンまとめ 一覧と構文例(随時追加中)

データベースから引き出したデータはなるべくきれいに表示したいものです。

とはいえ、いまどきechoを使いまくってPHP内からデータを書き出すのはナンセンスです。MVCの分担もできません。

そんなときにはテンプレートエンジン!!

データを渡せば簡潔な記述でhtmlに変換してくれます。また、コードとデザインを明確に分けることもでき、複数人での作業分担も可能になります。ということで今日はPHPのテンプレートエンジンをまとめてみました。

すごい数が出ていますので、とりあえず一覧と例文を載せておきます。(すべて試している訳ではありませんし知識も低いので、間違いがありましたらツイッターなどでご指摘ください。FF外歓迎。)

テンプレートエンジンまとめ

有名どころはBlade、Twig、Smarty、PHPTALあたりでしょうか。

ちなみにぼくはBladeとDIVを愛用しています。BladeはLaravelと相性が良いから。DIVは1ファイル完結なので組み込みやすく、依存も干渉しないので、たとえばWordPressの管理画面などで威力を発揮します。

どれも一長一短がありますので、あなたのコーディングスタイルに合っているものを選んでください。

おすすめエンジン

  • Blade・・・Laravel標準。拡張が柔軟。素のPHPも混ぜられる。
  • Twig・・・構文がきれい。PHPを感じさせないラッピング。自前メソッドはエンジン登録が必要で、拡張しづらい。
  • DIV・・・たった1ファイルで完結。局所使用に便利。大規模には向かない。
  • Smarty・・・万能。日本の利用者も多い。機能が多いゆえに重い。

 

2016.8.23追記 Laravel標準搭載のBladeを追加。
2016.9.5追記 Skinny、Foil、fenom、Latte、Voltを追加。
2021.12.17修正 Dwooのリンク修正。利用者が多いテンプレートを上に持ってくるよう、順序を整頓。

Blade

発音:ブレイド

公式サイト:https://laravel.com/docs/8.x/blade

Laravel標準搭載のテンプレートエンジン

{{ $x }} で変数を表示、@if~@endif などで分岐やループを呼ぶ。拡張子は「.blade.php」。

Laravelはいろいろなテンプレートに柔軟に対応できるが、結局Bladeを使うのが一番ラク。

基本は独自タグで記述するが、テンプレート中に<?php ~ ?>構文を書くことで、素のPHPを呼び出せる。そのため、Twigのように使いたいメソッドを事前にエンジンに登録する必要がなく、かなり柔軟。Twigほどラッピングせず、かつ面倒な出力メソッドを隠ぺいした感じ。

TwigやSmartyと違い、クラス変数とarrayは明確に分かれており、PHPと同じように書く。なんでも「.」で書けるTwigとはここが大きく違う。(クラス変数は$a->abc、arrayは$a[‘abc’])

継承やinclude、スニペット出力や各種セキュリティ処理も完備しています。

Laravel以外で使いたいときは、PackagistにBlade単体で使えるライブラリもある。(ただし依存ライブラリ多め 6MBほど) > https://packagist.org/packages/duncan3dc/blade

<html>
    <head>
        <title>App Name - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

 

Twig

発音:ツイグ

公式サイト:https://twig.symfony.com/

かなり活発な開発が続いているテンプレートエンジン。{{ ~ }}で変数の出力、{% ~ %}で判定やメソッドを書く。

フィルタ」と呼ばれる多数の処理が組み込まれていて、Twigだけでかなりの変形処理ができる。たとえばHTMLエスケープはPHP側で処理しなくても、{{ var | escape }}と書くだけでOK。非常に便利。

PHPを大きくラッピングしており、Twigだけでもかなりのレベルまで処理ができる。しかも表記は見やすく、きれい。

ただ、オリジナルメソッドや定義されていないメソッドを使いたいときは、事前にエンジンへの登録が必要で、そのような状況ではコード側が煩雑になる場合もある。もし定義されていないメソッドを多く使う場合は、Bladeがおすすめ。

またフィルタを多数使うと必然的にView(Tiwg)に依存するコードになってしまい、他のテンプレートに移行する際にセキュリティホールを生む場合があるので、気をつけたい。(上記のエスケープなど)

{{ var }}
{{ var|escape }}
{{ var|e }}         {# shortcut to escape a variable #}

{% for user in users %}
    * {{ user.name }}
{% else %}
    No user have been found.
{% endfor %}

 

Smarty

発音:スマーティ

公式サイト:http://www.smarty.net/

かなり多くの開発者が使っている、歴史の長い高機能テンプレートエンジン。日本人の利用者、貢献者が多いのも特長。

高機能が故にソースは他に比べてかなり大型。もちろんマニュアルも長大。

しかし多くの技術と文献が集積されているので、あらゆる状況において参考文献があり、答えられる人も多い。これからも使いやすいエンジンの一つであろうと思う。文献も日本語のものが多いのがうれしい部分。

{ } でくくった部分が変換される。

{foreach $foo as $bar}
  <a href="{$bar.zig}">{$bar.zag}</a>
  <a href="{$bar.zig2}">{$bar.zag2}</a>
  <a href="{$bar.zig3}">{$bar.zag3}</a>
{foreachelse}
  There were no rows found.
{/foreach}

 

 

Div PHP Template Engine

発音:ディブ

公式サイト:https://divengine.github.io/div/

1ファイルで完結するテンプレートエンジン

機能が絞られているが、軽いテンプレート処理には十分に使える。機能は、判定、ループ、出力などに絞られており、継承やincludeなどはない。Smartyよりも構文がシンプルなのが特長。

includeするだけで局所的に実行できるので、WordPressのプラグインの中で使ったり、小さなPHPスクリプトの出力に使ったりと、小回りが利く。他のエンジンが自動車なら、DIVは自転車のような感じ。

呼び出し:

echo new div("index.tpl", array(
    "products" => array(
         array("name" => "Banana", "price" => 5.3),
         array("name" => "Sweet potato", "price" => 6.1),
         array("name" => "Pumpkin", "price" => 4.3)        
    )
));

 

テンプレート(基本拡張子は.tpl 拡張子は自由):

<h1><a href = "http://divengine.com" style="text-decoration:none;">[[]] Div, PHP Template Engine</a></h1>

<h2>Products ({$products})</h2>
?$products
    <table border = "1">
        <tr><th>#</th><th>Name</th><th>Price</th></tr>
        [$products]
            <tr ?$_is_odd style = "background:#eeeeee;" $_is_odd?>
                <td>{$_order}</td>
                <td>{$name}</td>
                <td align="right">${#price:2.#}</td>
            </tr>
        [/$products]
    </table>
@else@
    <h2>Products don't exist</h2>
$products?

 

PHPTAL – PHP Template Attribute Language

発音:ピーエイチピー タル

公式サイト:http://phptal.org/

htmlに新たなタグ(<% %>など)を埋め込むのではなく、htmlの属性に命令を記述する。そのため、どのブラウザでもプレビューが正確になるのが一番の長所。

しかし補完してくれるエディタがないと、書くのが非常に面倒。さらにHTMLが大量になってくると属性だらけで見づらくなってくる。もともとがHTMLの属性なので、プログラムとしての補完が効きにくいのもデメリット。

<div class="item" tal:repeat="item itemsArray">
    <span tal:replace="item/getDate" tal:condition="item/hasDate">
    <a href="${item/getUrl}" tal:content="item/getTitle">
  <p tal:content="value/getContent">
</p></div>

 

 

Skinny

発音:スキニー

公式サイト:http://skinny.sx68.net/

日本発のテンプレートエンジンと銘打ち、シンプル、1ファイルを実現しているテンプレートエンジン。

日本人が開発しているため、文字コードの扱いにこだわりがあるのが特長。PHP内 / テンプレート内 / ブラウザ出力でそれぞれ文字コードが設定できる。古いEUC-JPのDBなどがある場合は、非常に助かりそう。

テンプレート拡張子は.htmlで、出力したい部分に<% ~ %>のタグで命令を書いていく。

1ファイルにも関わらずキャッシュ処理も搭載している。うまく使うことで2~10倍の高速処理が可能とうたわれている。

なぜか他のテンプレートエンジンでは真っ先に対応しているechoの代替タグがない。一番たくさん使うものなので、ぜひ装備してほしい。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><% echo(title) %></title>
</head>
<body>

今日は <% dval(nowtime,'Y/m/d H:i:s') %> です。<br /><br />

私の年齢は<% echo(my_age) %>歳です。<br />
<% if(my_age,>=,20) %>
成人しています。<br />
<% else %>
まだ未成年です。<br />
<% /if %>
<br />

<% echo(message|nl2br) %>

</body>
</html>

 

Volt

発音:ボルト

公式サイト:https://docs.phalconphp.com/en/latest/reference/volt.html

Phalcon系で標準採用されているテンプレートエンジン。{{~}}で出力、{%~%}でメソッドの実行。変数のアクセスはTwigに似ている。

大規模開発にも対応しているので、継承やインクルードなども充実している。

{% block last_products %}

{% for product in products %}
    * Name: {{ product.name|e }}
    {% if product.status == "Active" %}
       Price: {{ product.price + product.taxes/100 }}
    {% endif  %}
{% endfor  %}

{% endblock %}

 

haml

発音:ハムル

公式サイト:http://haml.info/

PHPというよりHTML生成メタ言語。

Wikiのような独自の記法を使ってhtmlを生成する。タグの構成をインデントで表現する、Yamlのような書き方。(たぶん名前もここから来ている)

テンプレートというよりはHTMLを手書きで作る、メタ言語的立場。Markdownと同類。

そのため閉じタグを書き忘れることはあり得ないのが利点。また、複雑なHTMLの構造が非常に見やすくなり、余分なタグや構造の問題(pの中にdivがあるような)を見つけやすくなる。

コマンドラインのコンパイラあり。GruntやGulpなどと組み合わせている人も多い。

!!!
%html
  %head
    %title Hello, Haml!
  %body
    #header
      %h1 Hello, Haml!
    #content
      %p
        I use Haml
        %span.version= Haml::VERSION

 

jade

発音:ジェイド

公式サイト:http://jade-lang.com/

PHPというよりHTML生成メタ言語。

hamlと似たような、階層型の記法を使う。JAVA Script(JST)系にて採用例多し。

!!! 5
html(lang="en")
  head
    title= pageTitle
    script(type='text/javascript')
      if (foo) {
         bar()
      }
  body
    h1 Jade - node template engine
    #container
      - if (youAreUsingJade)
        p You are amazing
      - else
        p Get on it!

 

Markdown

公式サイト:http://daringfireball.net/projects/markdown/

PHPというよりHTML生成メタ言語。

PHPだけでなく、メモや表記として広く使われる記法。PHPで変換出力可能。(外部ライブラリ必要)

hamlと同じくHTMLを生成するためのメタ言語的立場。GitHubのREADMEなどで標準採用されているので、一通り覚えておくといろいろ使える。ちなみに当サイトの原稿はMarkdownで書いています。(どうでもいいですね)

コマンドラインのコンパイラあり。GruntやGulpと組み合わせる人も多い。

Markdownコンパイラを内蔵したエディタもあります。(Windows : Markdown Pad 2、Mac Mouなどが有名。Sublime Text、VS Codeでもプラグインが存在)

A First Level Header
====================

A Second Level Header
---------------------

Now is the time for all good men to come to
the aid of their country. This is just a
regular paragraph.

The quick brown fox jumped over the lazy
dog's back.

 

 

fenom

発音:フェノム

公式サイト:https://github.com/fenom-template/fenom

Smartyの構文に近い、軽量エンジン。PSR-0に対応しており、オートロードに対応しているも特長。

テンプレートの拡張子も.tplでSmartyと揃えられているので、Smartyに慣れているけどSmartyを導入するほどでもない、小規模な部分に使えそう。

<html>
<body>
{block 'body'}
nothing to do there
{/block}
</body>
</html>

 

Foil

発音:フォイル

公式サイト:https://github.com/FoilPHP/Foil

BladeやTwigに影響を受けたとされる軽量エンジン。テンプレートは.phpにHTMLを書いていくような感じ。

個人的な感想だが、ほとんどラッピングが行われていないので、単純なPHPファイルとあんまり違わない気がする。既存のベタPHPファイルと置き換えるのは手軽かも。

セクションや継承などは使える。

<!DOCTYPE html>
<html>
    <head>
        <?php $this->section('head') ?>
          <link rel="stylesheet" href="style.css" />
          <title><?php $this->section('title') ?>My Home Page<?php $this->stop() ?></title>
        <?php $this->stop() ?>
    </head>
    <body>
        <div id="content">
          <?php $this->section('content') ?>
          <?php $this->stop() ?>
        </div>
        <div id="footer">
          <?php $this->section('footer') ?>
            &copy; Copyright 2014 by <a href="http://example.com/">you</a>.
          <?php $this->stop() ?>
        </div>
    </body>
</html>

 

Plates

発音:プレーツ

公式サイト:http://platesphp.com/

PHPをそのまま拡張したような形で、新しい構文を学ぶ必要がない、とされています。PSR-0のオートロードに対応。

確かにテンプレートはそのままPHPな感じで、echoは<?php echo ~か、<?= ~のショートタグとなります。これもFoilと同じで、普通のPHPファイルとあまり大差がなく、使いどころがイマイチわからない。

継承やセクションなどの機能もあります。

<html>
<head>
    <title><?=$this->e($title)?></title>
</head>
<body>

<?=$this->section('content')?>

</body>
</html>

 

Latte

発音:ラテ

公式サイト:https://github.com/nette/latte

高速、シンプルなテンプレートエンジン。PHP拡張型。

独自の繰り返し構文や判定構文を「マクロ」として登録してあり、変数を判定しながらの出力もカンタンそう。

<?php if ($items): ?>
    <?php $counter = 1 ?>
    <ul>
    <?php foreach ($items as $item): ?>
        <li id="item-<?php echo $counter++ ?>"><?php
        echo htmlSpecialChars(mb_convert_case($item, MB_CASE_TITLE)) ?>
        </li>
    <?php endforeach ?>
    </ul>
<?php endif?>

マクロ例

<ul n:if="$items">
    <li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

 

 

ShellPage

発音:シェルページ

公式サイト:http://www.maiatech.com/varpage.php

サイト全体を一つのClassとして管理し、データの送り先クラスを変えることでサイトイメージを一気に変えるという使い方。

<?php
include("./VarPage.class.php");

$page = new VarPage;
$page->templatefile = "./template.html";
$page->varnamelist = "title,headline,content";

$page->title = "Welcome To My Page";

$page->headline = "What My Page Is About";

$page->content .= <<<EOD
<p>Some regular text on my page. <b>Bold Blah blah blah blah.</b>
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.
Blah blah blah blah. Blah blah blah blah. Blah blah blah blah.</p>
<p><a href="/">Back To Home Page</a></p>
EOD;

$page->display_page();
?>

 

STP Simple Template Parser

発音:エスティーピー

名前の通りシンプルなテンプレートエンジン。とはいえ説明ページがNot Foundになっていて例文が読めず。

bTemplate

発音:ビーテンプレート

公式サイト:http://www.massassi.com/bTemplate/

たった1ファイルで構成された非常にシンプルなテンプレートエンジン。ほんのちょっとした出力に使えます。ただし使い込むには制限が多い。1ファイルタイプならDIVがオススメ。

<tag>という専用のタグを使い、属性に変数名を書いていく。

<html>
  <head>
    <title><tag:title /></title>
  </head>

  <body>
    <p>Hello, <tag:name /></p>
  </body>
</html>

 

Savant

発音:サーヴァント

公式サイト:http://phpsavant.com/download/

PHPの出力を拡張するという感じのテンプレートエンジン。書き出したい位置に<?php  ?>でくくってそのままPHPを書きます。

テンプレートエンジンという感じはあまりしない気が・・・

<html>

    <head>
        <title><?php echo $this->eprint($this->title); ?></title>
    </head>

    <body>

        <?php if (is_array($this->books)): ?>

            <!-- A table of some books. -->
            <table>
                <tr>
                    <th>Author</th>
                    <th>Title</th>
                </tr>

                <?php foreach ($this->books as $key => $val): ?>
                    <tr>
                        <td><?php echo $this->eprint($val['author']); ?></td>
                        <td><?php echo $this->eprint($val['title']); ?></td>
                    </tr>
                <?php endforeach; ?>

            </table>

        <?php else: ?>

            <p>There are no books to display.</p>

        <?php endif; ?>

    </body>
</html>

 

ETS easy template system

発音:イーティーエス

公式サイト:http://ets.sourceforge.net/

{ }を使ったテンプレートエンジン。変換の開始位置やループの開始位置に、{mask}という構文を置くのが特徴。

{mask:main} 
<html> 
 <head> 
  <title>{title}</title> 
 </head> 
 <body> 
  <h1>{title}</h1> 
  <hr> 
  <div align=”center”>Last modified: {lastmodified}</div> 
 </body> 
</html> 
{/mask}

 

vlib Template

発音:ブイリブテンプレート

公式サイト:http://vlib.clausvb.de/vlibtemplate.php

{  }内にtmpl_varなどから始まる構文を書く。

<!DOCTYPE html PUBLIC (...)>
<html>
<head>
   <title>{tmpl_var name='title_text'}</title>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>

<body>

<p>{tmpl_var name='body_text'}</p>

</body>
</html>

 

AvanTemplate

発音:アヴァンテンプレート

公式サイト:https://ja.osdn.net/projects/freshmeat_avantemplate/

1ファイルで構成されたテンプレートエンジン。[ ]で囲む構文を使う。bTemplateよりも条件分岐構文などが充実している感じ。

ただ更新は2001年で途絶えており、PHPの構文も古く、実質終了していると感じられる。

<HTML><BODY>[%name%]</BODY></HTML>

[%BLOCK_isblack_START%]It's BLACK![%BLOCK_isblack_END%]

 

Dwoo(開発終了)

発音:ドゥー

公式サイト:https://github.com/dwoo-project/dwoo

html内で、{ }を使いphpの変数をそのままくくって出力する感じ。(すでにメンテナンス停止)

<p>The date is {$date}</p>
<div class="article">
  <h1 class="title">{$article.title}</h1>
  <p class="content">{$article.content}</p>
  <p class="title">Posted by : {$article.author}</p>
</div>

 

Rain.TPL(開発終了?ページ消滅)

発音:レインティーピーエル

ワンファイルで完結する軽量テンプレートエンジン。比較的絞られた機能だが、キャッシュ処理なども搭載する。が、現在は開発ページも行方不明で、実質消滅したとみられる。

<h3>Variable example</h3>
{* all code between noparse tags is not compiled *}
<tt>variable {noparse}{$variable}{/noparse} = <b>{$variable}</b></tt>
<h3>Variable assignment</h3>
<tt>assignment {$number=10} and print {$number}</tt>
<h3>Operation with strings</h3>
<tt>
    {$variable . $number}
    {$number + 20}
</tt>
<h3>Variable Modifiers</h3>
<tt>
    {$variable|substr:0,7}
    a modifier on string: {"hello world"|strtoupper}
</tt>
<h3>Global variables</h3>
<tt>The variable is declared as global into the PHP {$GLOBALS.global_variable}</tt>
<h3>Show all declared variables</h3>
To show all declared variable use {noparse}{$template_info}{/noparse}.
<tt>
    {$template_info}
</tt>

mustache

発音:マスタッシュ

公式サイト:http://mustache.github.com/

htmlの中に二重の{{ ~ }}を使い変数を組み込んでいく。

変数だけではなく、ループや判定も{{~}}のくくりになるのが特殊。そのため一目では変数なのかメソッドなのか分かりづらい。

<h1>{{header}}</h1>
{{#bug}}
{{/bug}}

{{#items}}
  {{#first}}
    <li><strong>{{name}}</strong></li>
  {{/first}}
  {{#link}}
    <li><a href="{{url}}">{{name}}</a></li>
  {{/link}}
{{/items}}

{{#empty}}
  <p>The list is empty.</p>
{{/empty}}

 

FastTemplate(公式ページ不明?)

発音:ファストテンプレート

軽量、スピードがウリのテンプレートエンジン。
構文はhtml内で{ }でくくるタイプ。

公式ページが行方不明。クローンはいくつか出ている模様。

以下調査中・・・