Template Engine Package

NaifyView

HTML 拡張構文のテンプレートエンジン

HTML 拡張構文 Extension 対応 PHP 8.0+ コンパイル済み PHP

とは

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() を持ちます
ViewConfiguratortemplate root、cache、dialect、Extension など View 生成前の設定を組み立てます
Engineテンプレートの解決、コンパイル、実行をまとめる内部実行基盤
NaifyViewExtensionInterface構文や filter を追加するための拡張インターフェース。extend(NaifyViewExtensionRegistry) で登録します

APIリファレンス

NaifyView のクラスやメソッド、引数・戻り値の詳細を確認できます。