NaifyView Native 構文
HTML に直接記述できる、NaifyViewのテンプレート構文リファレンスです。変数の表示から条件分岐、ループ、部品の再利用まで、コード例とともに使い方を紹介します。
概要
NaifyView は、HTML の構造を保ちながら条件分岐やループを書けるテンプレートエンジンです。専用タグと JavaScript に似た式を組み合わせて記述します。HTML に近い形式なので、エディターの補完や構文ハイライトも活用しやすいです。
NaifyView Native の特徴
専用タグで表示を制御し、式とフィルターで値を加工します。テンプレートは PHP に変換して実行されます。主な特徴は次の4つです。
HTML として読める
制御構文は <nf-*> タグで書きます。ブラウザで開いた時に骨格がそのまま見え、IDE・補完・構文ハイライトも効きやすいです。
フィルターで値を整える
値の加工は user.name.upper() のようにドットでつなげて書きます。パイプや矢印の記法は使わず、処理の順序を追いやすい形に統一しています。
PHP に変換して実行する
テンプレートを PHP のクラスに変換し、キャッシュが有効な間は再利用します。同じテンプレートを繰り返し表示する際の変換処理を省けます。
メソッド呼び出しを制限する
PHP メソッドを呼べる変数を明示的に指定し、通常の変数と区別します。メソッド呼び出しにはassignTrusted()が必要です。出力の自動エスケープも設定できます。
まずは基本のサンプル
まずは、変数の表示、条件分岐、ループを組み合わせた例を見てみましょう。いずれも HTML の中に直接記述できます。
<h1>{{ title }}</h1>
<nf-if test="user.is_admin">
<p>管理者メニュー</p>
<nf-else>
<p>一般メニュー</p>
</nf-if>
<ul>
<nf-for-each exp="item in items">
<li>{{ item.name }} / {{ $api.formatPrice(item.price) }}</li>
</nf-for-each>
</ul>
PHP 側は通常の値を assign() で渡し、テンプレートから PHP オブジェクトのメソッドを呼びたいものだけ assignTrusted() で渡します。
use NaifyView\NaifyView;
NaifyView::boot();
$view = NaifyView::create(
NaifyView::configure(__DIR__ . '/views')
->setCacheDir(__DIR__ . '/_cache')
);
$view->assign('title', 'Hello, NaifyView!');
$view->assign('user', $user);
$view->assign('items', $items);
$view->assignTrusted('api', new class {
public function formatPrice(int|float $price): string
{
return number_format($price) . ' 円';
}
});
$view->setTemplate('index.html');
echo $view->render();
assignTrusted('api', ...) で渡した値は、テンプレートでは $api として参照します。通常の api ではなく、先頭に $ を付けた変数だけが認証変数になります。
よく使うフィルターとエスケープ
日常的には default()、escape()、raw()、nl2br()、文字列整形、日付・数値整形を押さえれば書き始められます。
{{ user.nickname.default('未設定') }}
{{ user.name.escape() }}
{{ query.escape('url') }}
{{ description.escape().nl2br() }}
{{ safeHtml.raw() }}
{{ title.trim().truncate(20, '...') }}
{{ row.datetime.toDate('Y-m-d') }}
{{ price.round(2) }}
通常表示
{{ user.name }} のような変数の参照だけからなる式の値出力は autoEscapeの対象です。計算式を安全に出したい時は .escape() を明示します。
HTMLを出したい時
.raw() は安全性を確認済みの HTML だけに使います。自動エスケープが ON の時だけエスケープを抑止する指定になります。
構文紹介
ここからはNativeの制御構文を紹介します。条件分岐、ループ、変数、部品化、レイアウトを HTML タグとして書きます。
条件分岐
<nf-if> / <nf-elseif> / <nf-else> で HTML を出し分けます。
ループ
<nf-for-each> と <nf-for-range> で一覧や範囲を描画します。
変数
<nf-set> で値を置き、<nf-capture> で描画結果を変数に入れます。
テンプレート合成
<nf-include>、<nf-macro>、<nf-layout>、<nf-slot> で部品化します。
生出力 / コメント
<nf-literal> と <nf-comment> で、構文例や出力しないメモを扱います。
テンプレートの基本設定
テンプレートの配置場所、キャッシュの保存先、自動エスケープを設定します。
詳細リファレンス
ここからは変数、条件式、ループなどをカテゴリごとに紹介します。各構文の属性、使用例、注意点を確認できます。
変数
基本の変数展開
{{ ... }} は値を表示するための構文です。通常の変数、配列、オブジェクト形式の値はドット記法と角括弧の記法でたどれます。
{{ title }}
{{ user.name }}
{{ items[0].label }}
{{ settings['site_name'] }}
{{ count + 1 }}
{{ user.name ~ ' さん' }}
{{ mode == 'dev' ? 'DEV' : 'LIVE' }}
認証変数 (TrustedObject)
通常の変数からは PHP メソッドを呼び出せません。メソッドを呼び出す必要がある場合は、PHP 側で assignTrusted() を使って変数を渡します。テンプレートでは、変数名の先頭に $ を付けて参照します。
{{ $user.displayName() }}
{{ $user.isAuthed() }}
{{ $items[0].formatLabel() }}
{{ $API.getInformation() }}
{{ $api.formatPrice(item.price) }}
{{ @filter($api.labelFor(user.role)).escape() }}
認証変数でも -> は使いません。Native 構文の記法は $obj.method() に統一します。
<nf-set> テンプレート内で変数を設定する
属性で変数を設定します。値をそのまま入れるなら value、式として評価するなら expr を使います。
<!-- リテラル文字列を変数へ入れる -->
<nf-set name="greeting" value="こんにちは"></nf-set>
<!-- 式を評価して変数へ入れる -->
<nf-set name="label" expr="user.name ~ ' さん'"></nf-set>
<!-- 配列 / map / range も式として扱える -->
<nf-set name="roles" expr="[person.role, guest.role]"></nf-set>
<nf-set name="payload" expr="{state: active_key, roles: roles}"></nf-set>
<nf-set name="pages" expr="1..10"></nf-set>
| 属性 | 必須 | 説明 |
|---|---|---|
name | 必須 | 変数名 |
value | 任意 | 設定するリテラル値 (文字列など) |
expr | 任意 | 評価する式 (例: user.name, a ~ b) |
value と expr は同時に指定しません。タグの中身を変数へ入れたい場合は <nf-capture> を使います。
<nf-capture> 描画結果を変数へ入れる
タグ内の描画結果を文字列として変数に保存します。name で変数への代入、append で配列への追加を指定できます。
<!-- タグ内の描画結果を cardTitle へ入れる -->
<nf-capture name="cardTitle">
<strong>{{ user.name }}</strong>
</nf-capture>
{{ cardTitle.raw() }}
<!-- append を使うと配列へ追加できる -->
<nf-capture append="rows">
<li>{{ item.label }}</li>
</nf-capture>
| 属性 | 必須 | 説明 |
|---|---|---|
name | 任意 | 描画結果を文字列として代入する変数名 |
append | 任意 | 描画結果を配列へ追加する変数名 |
name と append は同時に指定しません。どちらも無い場合や、名前が不正な場合は専用のエラーで止めます。
@this 変数名を指定して参照する
@this を使うと、テンプレートに渡された変数を名前で参照できます。参照する変数名を別の変数で切り替えたい場合に使います。
{{ @this[object_name].name }}
{{ @this['people'][active_person].role }}
認証変数の詳細 / $api.xxx
assignTrusted() で渡した変数だけは、テンプレートから PHP メソッドを呼べる認証変数として扱います。変数名の先頭に$が付くことで見分けられます。. / [] の解釈は通常変数と揃え、辿る先だけ PHP オブジェクトや配列になります。
$view->assign('user', $user); // 通常の変数: {{ user.name }}
$view->assignTrusted('user', $user); // メソッドを呼び出せる変数: {{ $user.isAuthed() }}
$view->assignTrusted('API', $API); // メソッドを呼び出せる変数: {{ $API.getInformation() }}
$view->assignTrusted('api', $api); // メソッドを呼び出せる変数: {{ $api.method() }}
{{ $api.formatPrice(item.price) }}
{{ $user.isAuthed() }}
{{ $API.getInformation() }}
{{ $api.labelFor(user.role) }}
{{ @filter($api.labelFor(user.role)).escape() }}
認証変数のプロパティやメソッドも、$obj.name や $obj.method() のようにドットで参照します。
テンプレートから呼び出すメソッドは、表示に必要な値を返す処理に絞ります。exit など、ページ全体の処理を終了させる操作は含めません。
条件式
<nf-if> 条件分岐を行う
test 属性の式が真と評価される場合に中身を描画します。現在の Native 構文は &&, ||, !, ==, != などの記号で記述します。
<!-- test が true の時だけ中身を描画する -->
<nf-if test="user.active && user.role == 'member'">
ようこそ、{{ user.name }}さん
</nf-if>
| 属性 | 必須 | 説明 |
|---|---|---|
test | 必須 | 評価する条件式 |
<nf-elseif> 追加条件で分岐する
<nf-if> の追加条件分岐です。直前の条件が false の場合に評価されます。
<!-- 上から順に評価し、最初に true になったブロックだけ描画する -->
<nf-if test="count == 0">
なし
<nf-elseif test="count < 10">
少数
<nf-elseif test="count < 100">
中程度
<nf-else>
大量
</nf-if>
| 属性 | 必須 | 説明 |
|---|---|---|
test | 必須 | 評価する条件式 |
<nf-else> 条件に一致しない場合を描画する
<nf-if> / <nf-elseif> のいずれも true でなかった場合に描画されます。属性なし。
<!-- どの条件にも一致しなかった時の fallback -->
<nf-if test="user.active">
有効ユーザー
<nf-else>
無効ユーザー
</nf-if>
| 属性 | 必須 | 説明 |
|---|---|---|
- | - | 属性なし |
条件式 / test="..."
<nf-if>, <nf-elseif>, 三項演算子などで使う条件式のNative構文です。論理演算、定義済みかの判定、比較、配列アクセスは式出力と同じ式の評価処理を共有します。
| 分類 | 構文 | 説明 |
|---|---|---|
| 論理 | &&, ||, !expr | AND / OR / NOT |
| 比較 | ==, !=, >, >=, <, <= | 値を比較する演算子 |
| 定義済みかの判定 | value == defined, value != defined | 参照先が存在するか / 未定義かを判定する |
| 包含判定 | value in items | 配列・iterable・文字列への包含判定。否定は !(value in items) |
| 文字列の判定 | left starts with right | 前方一致の判定 |
| 算術 | +, -, *, /, % | 数値演算。% は剰余を求める演算子 |
| 真偽の判定 | flag, !flag, value != null | 値の真偽や null との比較で判定する |
<nf-if test="user.name == defined && user.age >= 20">
{{ user.name }}
</nf-if>
<nf-if test="!flag || items.length() == 0">
fallback
</nf-if>
<nf-if test="user.nickname != defined">
nickname is missing
</nf-if>
<nf-if test="'alpha' in tags">
hit
</nf-if>
<nf-if test="slug starts with 'docs/'">
docs
</nf-if>
論理演算には &&、||、! を使います。値が定義されているかは value == defined、空の配列かは arr.length() == 0、null かは value == null で判定します。
比較には == / != を使います。=== / !== は使用できません。
ループ
<nf-for-each> 配列や iterable を繰り返す
配列・連想配列・iterable をループします。
<!-- items の各要素を item として描画する -->
<ul>
<nf-for-each exp="item in items">
<li>{{ item.label }}</li>
</nf-for-each>
</ul>
<!-- key 付きで連想配列を読む -->
<nf-for-each exp="key, value in settings">
{{ key }} = {{ value }}
</nf-for-each>
<!-- name を付けるとネスト時に outer.index のように参照できる -->
<nf-for-each exp="group in groups" name="outer">
<nf-for-each exp="item in group.items" name="inner">
{{ outer.index }}.{{ inner.index }}: {{ item }}
</nf-for-each>
</nf-for-each>
| 属性 | 必須 | 説明 |
|---|---|---|
exp | 必須 | ループ式 (item in items / key, item in map) |
name | 任意 | ループ名(入れ子のループで状態を参照する際に使う) |
<nf-for-range> 数値範囲を繰り返す
数値範囲でループします。基本の書き方はi = 0 to 10 step 1です。0..3 は値を公開しないショートカットとして扱います。
<!-- i に 0 から 10 までの値を入れて繰り返す -->
<nf-for-range exp="i = 0 to 10 step 1">
<div>{{ i }}</div>
</nf-for-range>
<!-- step を指定して 10 ずつ進める -->
<nf-for-range exp="n = 0 to 100 step 10">
{{ n }}
</nf-for-range>
<!-- 変数名なし。回数だけ回したい時のショートカット -->
<nf-for-range exp="0..3">
<span class="dot"></span>
</nf-for-range>
| 属性 | 必須 | 説明 |
|---|---|---|
exp | 必須 | 範囲式。基本の書き方は var = start to end step n。ショートカットとして start..end も使える |
name | 任意 | ループ名 |
変数名なしの 0..3 は繰り返し中の値を変数として参照できません。値が必要な時はi = 0 to 3 を使います。
<nf-break /> ループを抜ける
ループを抜けます。loop 属性なしの場合は最も内側のループが対象です。
<!-- item.stop が true になったら outer ループを抜ける -->
<nf-for-each exp="item in items" name="outer">
<nf-if test="item.stop">
<nf-break loop="outer" />
</nf-if>
{{ item.label }}
</nf-for-each>
| 属性 | 必須 | 説明 |
|---|---|---|
loop | 任意 | ループ名 (指定したループまで抜ける) |
ループの外で <nf-break> を書くと構文解析時のエラーになります。
<nf-continue /> 次の繰り返しへ進む
ループの次の繰り返しへ進みます。指定が無い時は最も内側のループが対象です。
<!-- hidden な item は描画せず、次の item へ進む -->
<nf-for-each exp="item in items">
<nf-if test="item.hidden">
<nf-continue />
</nf-if>
{{ item.label }}
</nf-for-each>
<!-- named loop を指定すると outer ループを continue できる -->
<nf-for-each exp="group in groups" name="outer">
<nf-for-each exp="item in group.items" name="inner">
<nf-if test="item.skip_group">
<nf-continue loop="outer" />
</nf-if>
{{ item.label }}
</nf-for-each>
</nf-for-each>
| 属性 | 必須 | 説明 |
|---|---|---|
loop | 任意 | ループ名 (指定したループの次の繰り返しへ進む) |
loop="outer" を付けると名前付きループの次の繰り返しへ進めます。指定が無い時は最内ループが対象です。
ループの状態を表す変数
ループの中で使える自動変数です。
| 変数 | 説明 |
|---|---|
loop.index | 0 始まりのインデックス |
loop.index1 | 1 始まりのインデックス |
loop.first | 最初の繰り返しなら true |
loop.last | 最後の繰り返しなら true |
loop.length | 総件数 |
loop.count | length のエイリアス |
<nf-for-each exp="item in items">
{{ loop.index }}/{{ loop.length }}: {{ item }}
<nf-if test="loop.last == false">, </nf-if>
</nf-for-each>
<!-- named loop 版 (name="outer" の場合 outer.index 等) -->
<nf-for-each exp="g in groups" name="outer">
<nf-for-each exp="i in g.items" name="inner">
{{ outer.index }}.{{ inner.index }}
</nf-for-each>
</nf-for-each>
テンプレートの部品化
<nf-include> 別テンプレートを読み込む
別テンプレートをインクルードします。
<!-- 静的なテンプレートを読み込む -->
<nf-include src="partial/user-card.html"></nf-include>
<!-- 変数を渡す -->
<nf-include src="partial/user-card.html" with="{ user, active: status == 'warm' }"></nf-include>
<!-- rename して渡す -->
<nf-include src="partial/greeting.html" with="{ user as actor }"></nf-include>
<!-- include 先を式で決める -->
<nf-include dynamic="'partial/' ~ card_type ~ '.html'" with="{ user }"></nf-include>
<!-- 別テンプレートとして読み込む -->
<nf-include src="partial/heavy-card.html" bundle="false"></nf-include>
| 属性 | 必須 | 説明 |
|---|---|---|
src | 必須* | 静的なテンプレートファイルパス (相対または views ルート絶対) |
dynamic | 任意 | 式で読み込み先を決めます。src とは同時指定できない |
with | 任意 | 渡す変数 ({name, user as actor} 形式) |
bundle | 任意 | auto / true / false。false は実行時のテンプレート読み込み処理を使う |
読み込み先は src または dynamic のどちらかで指定します。変数を渡す場合は with を使います。
<nf-macro> 再利用できる部品を定義する
再利用可能なマクロを定義します。同じテンプレート内から呼び出せます。
<!-- badge というマクロを定義する -->
<nf-macro name="badge" args="label, count">
<span class="badge">{{ label }} ({{ count }})</span>
</nf-macro>
<!-- 定義したマクロを式として呼び出す -->
{{ badge('新着', 5) }}
| 属性 | 必須 | 説明 |
|---|---|---|
name | 必須 | マクロ名 |
args | 任意 | 引数リスト (カンマ区切り、例: label, count) |
<nf-layout> レイアウトを定義または使用する
レイアウトの定義 (define) または使用 (use)。<nf-slot> と組み合わせてコンポーネント合成やページ骨格の差し込みを行います。
<!-- 定義 (layouts/page.html) -->
<nf-layout define="page">
<html>
<head>
<title><nf-slot name="title">Default Title</nf-slot></title>
</head>
<body>
<main><nf-slot name="content">default</nf-slot></main>
</body>
</html>
</nf-layout>
<!-- 使用 -->
<nf-layout use="page" src="layouts/page.html">
<nf-slot name="title">ユーザー一覧</nf-slot>
<nf-slot name="content">
<h1>ユーザー</h1>
</nf-slot>
</nf-layout>
<!-- component 定義 (layouts/card.html) -->
<nf-layout define="card">
<div class="card">
<h3><nf-slot name="title"></nf-slot></h3>
<div><nf-slot name="body"></nf-slot></div>
</div>
</nf-layout>
<!-- 使用 -->
<nf-layout use="card" src="layouts/card.html" with="{ user }">
<nf-slot name="title">{{ user.name }}</nf-slot>
<nf-slot name="body">{{ user.bio }}</nf-slot>
</nf-layout>
| 属性 | 必須 | 説明 |
|---|---|---|
define | 任意 | レイアウトを定義する名前 (define または use のどちらかが必須) |
use | 任意 | 使用するレイアウト名 |
src | 任意 | レイアウト定義元のテンプレートファイル (use 側で指定) |
with | 任意 | レイアウトに渡す変数 ({name, user as actor} 形式) |
<nf-slot> レイアウトへ内容を差し込む
レイアウトの差し込み口です。define 側では口を定義し、use 側では内容を差し込みます。
<!-- define 側: title という差し込み口を用意する -->
<nf-slot name="title">Default Title</nf-slot>
<!-- use 側: title へ内容を差し込む -->
<nf-slot name="title">ユーザー一覧</nf-slot>
| 属性 | 必須 | 説明 |
|---|---|---|
name | 必須 | スロット名 |
例は <nf-layout> を参照してください。
<nf-literal> テンプレート構文を解釈せずに出す
中身を生のまま出力します。<nf-*> や {{ }} も解釈せずそのまま出ます。テンプレート構文自体をドキュメントに載せる時に使います。属性なし。
<!-- 中身の nf タグや {{ ... }} をテンプレート構文として解釈しない -->
<nf-literal>
<nf-if test="...">これは解釈されない</nf-if>
{{ この式もそのまま表示される }}
</nf-literal>
| 属性 | 必須 | 説明 |
|---|---|---|
- | - | 属性なし |
<nf-comment> 出力されないメモを書く
中身をコメント扱いにします。出力されません。属性なし。
<!-- テンプレート内に残すが、HTML には出力しない -->
<nf-comment>
このメモは生成される HTML には含まれない
</nf-comment>
| 属性 | 必須 | 説明 |
|---|---|---|
- | - | 属性なし |
HTML コメント <!-- --> と違って、出力に残りません。
式・フィルター
{{ ... }} 式出力
値または式を評価して出力します。autoEscape を有効にした場合でも、自動 HTML エスケープは {{ user.name }} のような変数の参照だけからなる式の値出力だけにかかります。{{ user.name ~ '<>' }} のような計算式は、テンプレートの作成者が組み立てた文字列としてそのまま出します。式の結果をエスケープしたい時は .escape() を明示します。
{{ user.name }}
{{ items[0].label }}
{{ count + 1 }}
{{ count % 2 ? 'odd' : 'even' }}
{{ mode == 'dev' ? 'DEV' : 'LIVE' }}
{{ a ~ b }}
{{ map['dynamic'] }}
{{ obj[i + '_name'] }}
{{ [person.name, guest.name].join(' / ') }}
値の出力と条件判定は式の評価処理を共有しているので、== defined, != defined, 三項演算子, %, [] なども同じ感覚で使えます。
通常の変数のドット呼び出しはメソッド呼び出しではなくフィルター処理として解釈します。通常のオブジェクトに無条件でメソッド呼び出しを開きません。
フィルターやメソッドはドットでつなげます。| や -> は使用できません。
式リテラル
配列、連想配列、数値の範囲は、式の中で直接作成できます。{{ ... }}, expr, test, with など、式を指定する場所で利用できます。
| 分類 | 構文 | 説明 |
|---|---|---|
| list | [a, b, c] | PHP の配列に相当するリストを作る |
| map | {state: active_key, label: user.name} | 文字列キーの連想配列を作ります。引用符なしのキー、引用符で囲んだキー、整数のキーを使う |
| range | 1..10 | 整数の範囲を作ります。10..1 のような降順も扱える |
<nf-set name="payload" expr="{state: active_key, roles: [person.role, guest.role]}"></nf-set>
{{ payload.state }}
{{ payload.roles.join(' / ') }}
<nf-set name="pages" expr="1..5"></nf-set>
{{ pages.join(', ') }}
<nf-include src="partial/card.html" with="{ user, flags: [active_key, mode] }"></nf-include>
連想配列のキーは直接記述します。変数でキーを指定して値を読む場合は obj[key] を使います。
ドット記法のフィルター
フィルターはドット記法で指定します。obj.escape()、text.trim()、items.length() のように書きます。
{{ user.name.upper() }}
{{ items.length() }}
{{ text.trim().escape() }}
{{ user.nickname.default('未設定') }}
{{ html.raw() }}
{{ list.join(', ') }}
{{ tags.split(',').first() }}
{{ payload.jsonEncode().raw() }}
{{ feedback.category.urlEncode() }}
{{ row.datetime.toDate('Y-m-d H:i:s') }}
{{ user.enabled.toString() }}
{{ user.nickname.isEmpty().toString() }}
{{ user.nickname.isDefined().toString() }}
{{ user.name.contains('Mi').toString() }}
{{ route_path.startsWith('portal').toString() }}
{{ route_path.endsWith('profile').toString() }}
{{ title.truncate(20, '...') }}
{{ price.round(2) }}
default() は、未定義 / null / 空文字に対して使えます。[] / オブジェクトは、代替値への置き換えを前提にしません。false / 0 は曖昧な値として専用のエラーになります。
組み込みフィルター一覧
| フィルター | 用途 | 例 |
|---|---|---|
escape(strategy?), esc(strategy?) | 指定した方式でエスケープし、autoEscape 有効時でも再エスケープされないエスケープ済みの出力として返します。省略時は html。現在は html, url, js。 | user.name.escape(), query.escape('url') |
raw() | 値をそのまま出したい時に使います。自動エスケープが ON の時だけ意味を持ちます。 | html.raw() |
default(value) | 未定義・null・空文字の場合に表示する代替値を指定します。 | user.nickname.default('未設定') |
isEmpty() | default() と同じ空かどうかの判定を真偽値で返します。 | user.nickname.isEmpty().toString() |
isDefined() | 参照先が存在するかを真偽値で返します。null は「定義済み」、未定義は false。 | user.nickname.isDefined().toString() |
upper(), lower(), trim(chars?) | 文字列の大小変換、前後の空白などの除去。 | title.trim().upper() |
replace(search, replace) | 文字列置換。 | slug.replace('/', '-') |
contains(value) | 文字列の部分一致。結果は真偽値なので見たい時は toString() をつなぎます。 | user.name.contains('Mi').toString() |
startsWith(value), endsWith(value) | 前方一致 / 後方一致。 | path.startsWith('docs/').toString() |
truncate(length, suffix?) | 長い文字列を省略記号付きで切り詰めます。suffix 省略時は ...。 | title.truncate(20, '...') |
nl2br() | エスケープ済みの文字列の改行を <br> へ変換し、エスケープ済みの出力として返します。 | body.nl2br() |
split(delimiter) | 文字列を配列へ分割します。 | tags.split(',') |
join(glue) | 配列形式の値を文字列へ連結します。 | roles.join(', ') |
length() | 文字列長、配列の件数、Countable オブジェクトの件数を返します。 | items.length() |
first(), last(), slice(offset, length?) | 配列・文字列の先頭、末尾、部分切り出し。 | tags.first() |
keys() | 配列のキーの一覧を返します。 | settings.keys() |
merge(value) | 配列形式の値を結合します。 | base.merge(extra) |
sort() | 配列形式の値を昇順ソートして返します。 | scores.sort() |
jsonEncode(), jsonDecode() | JSON 文字列化 / JSON 解析。 | payload.jsonEncode().raw() |
urlEncode() | URL 用にパーセントエンコードします。 | keyword.urlEncode() |
toString() | 明示的な文字列化。undefined, null, false を見分けたい時に使います。 | user.enabled.toString() |
toDate(format?) | タイムスタンプ / 日付文字列 / DateTimeInterface を日付文字列へ変換します。 | row.datetime.toDate('Y-m-d') |
round(precision?) | 数値を四捨五入します。precision 省略時は整数に丸めます。 | price.round(2) |
フィルターを明示的に適用する / @filter(...)
認証変数やマクロの戻り値にフィルターを適用する場合は、@filter(...) を使います。
{{ @filter($obj.method(test)).escape() }}
{{ @filter($obj.members[0].label(test)).slice(0, 6).upper() }}
{{ @filter(_self.render_badge_line(user.name, user.role)).replace('admin', 'lead') }}
認証変数の $obj.xxx はPHPオブジェクトの操作です。参照先の指定方法は通常の変数と同じで、$obj[methodName]() のような変数で名前を指定するメソッドも PHP オブジェクトに対して解決します。そこへドット記法のフィルターを繋げたい時だけ @filter(...) を使います。
設定・関連情報
テンプレートの基本設定
NaifyView::configure() でテンプレートの配置場所やキャッシュの保存先を設定し、NaifyView::create() に渡します。
$config = NaifyView::configure(__DIR__ . '/views')
->setCacheDir(__DIR__ . '/cache')
->setTemplateBasePath('pages')
->setTemplate('index.html')
->setAutoEscape(true);
$view = NaifyView::create($config);
| 設定 | 用途 |
|---|---|
setCacheDir() | キャッシュの保存先ディレクトリを指定します。 |
setTemplateBasePath() | テンプレートの基準となるサブディレクトリを指定します。 |
setTemplate() | 描画するテンプレートを指定します。 |
setAutoEscape() | 変数を表示する際の自動 HTML エスケープを有効にします。 |
自動エスケープの既定値はfalseです。有効にする場合は setAutoEscape(true) を指定します。計算式の出力には .escape() を明示します。詳しくは式出力を参照してください。