SilexでPHPTALを使う

SilexでPHPTALを使うためのエクステンションを作ってみました。

Silexとは

Silexの詳細については前回の記事 Silexを試してみた を見てください。
また、前回の記事で紹介したMameFormアプリはひっそりと更新されています。
というのも、Silexのエクステンションが幾つか追加されたのでメール送信はSwiftmailerエクステンションで送信されるようにしました。

PHPTALとは

PHPTALとはPHPのテンプレートエンジンです。HTMLのタグの属性で表現し、SmartyやTwigのようなテンプレートエンジンのように独自タグを使わないのデザイン確認などの組み込み作業時でも確認が行えます。そのためデザイナーさんが使いやすいテンプレートエンジンといえます。pinocoのようなデザイナーフレンドリーなフレームワークで採用されています。

使い方(準備)

もともとエクステンションといってもPHPTALのインスタンスを簡単に作成してくれるにすぎません。
PHPTALのライブラリをvendor/phptalに配置します。

PHPTALExtensionをGitHubからとってきます。
このとき、src/Silex/Extensionというディレクトリを作りそこに配置します。

$ git clone git://github.com/brtriver/PHPTALExtension.git ./src/Silex/Extension

これで準備は完了です。PHPTALのテンプレートは標準ではviewsディレクトリ以下に配置するようになっています。

そして、ディレクトリ構成は以下のような感じになることを想定しています。

/project_directory
│  ├── silex.phar
│  └── index.php
├── src
│   └── Silex
│       └── Extension
│           └── PHPTALExtension.php
├── vendor
│   └── phptal
└── views (PHPTALのテンプレートはviewsディレクトリに配置します)
    └── teset.html

使い方(コントローラーの書き方)

あとはSilexのコントローラーで以下のように書けばOKです。

<?php
require_once __DIR__.'/silex.phar';
require_once __DIR__.'/src/Silex/Extension/PHPTALExtension.php';

use Silex\Extension\PHPTALExtension;

$app = new Silex\Application();
$app->register(new PHPTALExtension());

$app->get('/test/{name}', function($name) use($app) {
    // set your view file. view file is set under /views directory
    $app['phptal.view'] = "test.html";
    $app['phptal']->title = "PHPTAL in Silex";
    $app['phptal']->name = $name;
    return $app['phptal']->execute();
});
$app->run();

ポイントは以下の点です。

  • PHPTALExtension.phpをrequireで読み込む
  • use Silex\Extension\PHPTALExtension を宣言しておく
  • エクステンションを使うために登録を行う[$app->register(new PHPTALExtension())]
  • $app['phptal.view'] にテンプレートのパスを書く
  • $app['phptal']はPHPTALのインスタンスなので、最後に return $app['phptal']->execute()する

これでhttp://example.com/test/brtriver のような呼び出しが行われると$app->getメソッド部分が処理され、views/test.htmmlが処理されます。

その他

$app['phptal.view']でテンプレートのファイルのパスを指定します。もしviewsディレクトリ以下にディレクトリを作成しそこに配置したい場合は

$app['phptal.view'] = "dir/test.html";

ようにディレクトリ名部分を含むパスを記述すればOKです。

ここで$app['phptal']はPHPTALのインスタンスそのものです。なのでPHPTALを使いなれている方はnew PHPTAL()を行った結果のものと同じと考えてもらえればわかりやすいかと。


「簡単なデザイン寄りなサイトでテンプレートとルーティングが使いたい」などと言う場合はSilex + PHPTAL はなかなか使いやすいのではないでしょうか?