Template Engine Package
NaifyView
HTML 拡張構文のテンプレートエンジン
HTML 拡張構文
Extension 対応
PHP 8.0+
コンパイル済み PHP
NaifyViewとは
HTMLの構造を崩さない制御構文で、IDEのシンタックスハイライトや補完がそのまま動きます。
<nf-if> や <nf-for-each> はHTMLタグとして書くため、テンプレートを通常のHTMLファイルとして扱えます。テンプレートはPHPにコンパイルして実行されるため、実行速度も確保できます。
Extension を追加すれば、Smarty や Twig などのテンプレート構文を後付けすることも可能で、既存資産の移行にも使いやすいです。
基本構文
制御構文はHTMLタグとして書きます。変数は {{ }} で展開し、条件やループはタグ属性で渡します。
タグごとの書き方を確認したい場合は、NaifyView Native 構文リファレンス に早見表をまとめています。
<!-- 変数展開 -->
{{ title }}
{{ user.name }}
{{ price.number_format() }}
<!-- 条件分岐 -->
<nf-if test="user.isAdmin()">
<p>管理者メニュー</p>
<nf-else />
<p>一般メニュー</p>
</nf-if>
<!-- 繰り返し -->
<nf-for-each exp="item in items">
<li>{{ item.name }}</li>
</nf-for-each>
レイアウト継承
レイアウトと子テンプレートの関係を nf-layout と nf-slot で定義します。
<!-- _layout.html: レイアウト定義 -->
<nf-layout define="page">
<!doctype html>
<html>
<head><title><nf-slot name="page_title"></nf-slot></title></head>
<body>
<nf-slot name="page_body"></nf-slot>
</body>
</html>
</nf-layout>
<!-- page.html: 子テンプレート -->
<nf-layout use="page" src="./_layout.html">
<nf-slot name="page_title">タイトル</nf-slot>
<nf-slot name="page_body">本文</nf-slot>
</nf-layout>
最初の入口
NaifyViewは、Configurator で設定を組み立て、NaifyView::create() でインスタンスを生成します。
use NaifyView\NaifyView;
NaifyView::boot();
$view = NaifyView::create(
NaifyView::configure(__DIR__ . '/views')
->setCacheDir(__DIR__ . '/_cache')
);
$view->assign('title', 'Hello, NaifyView!');
$view->assign('items', $items);
$view->setTemplate('index.html');
echo $view->render();
Extension
構文を後付けで追加できる仕組みを持ちます。NaifyViewExtensionInterface を実装した Extension を Configurator に渡します。
use NaifyView\NaifyView;
use NaifyView\Extension\NaifyViewExtensionRegistry;
use NaifyView\Extension\NaifyViewExtensionInterface;
NaifyView::boot();
$view = NaifyView::create(
NaifyView::configure(__DIR__ . '/views')
->addExtension(new class implements NaifyViewExtensionInterface {
public function extend(NaifyViewExtensionRegistry $registry): void
{
$registry->addFilterHandler([
'upper' => static fn(mixed $v): string => strtoupper((string) $v),
]);
}
})
);
どこまで含むか / 含まないか
含むもの
- HTML 拡張タグによる制御構文
- 変数展開とフィルター
- レイアウト継承・インクルード・マクロ
- テンプレートの PHP コンパイルとキャッシュ
- Extension による構文の追加
含まないもの
- 特定フレームワークへの密結合
- Smarty / Twig の実装本体 (Extension で別途追加する)
- ビジネスロジック的な組み込み関数の大量同梱
主要クラス
Parser → Compiler → Renderer のパイプライン構造で、どこで何が起きているか追いやすい設計になっています。
| クラス | 役割 |
|---|---|
NaifyView | パッケージの入口。Configurator の生成と View インスタンスの組み立てを担当します |
View | テンプレートのアサイン・設定・レンダリングの窓口。assign() / setTemplate() / render() を持ちます |
ViewConfigurator | template root、cache、dialect、Extension など View 生成前の設定を組み立てます |
Engine | テンプレートの解決、コンパイル、実行をまとめる内部実行基盤 |
NaifyViewExtensionInterface | 構文や filter を追加するための拡張インターフェース。extend(NaifyViewExtensionRegistry) で登録します |
APIリファレンス
NaifyView のクラスやメソッド、引数・戻り値の詳細を確認できます。