phalconテンプレートエンジン(volt)カスタムフィルタ

3202 ワード

引用子:今日問題が発生しました.テンプレートの変数の一部が定義されていない場合があります.phpがE_をオンにした場合.ALLエラーレベルでは、変数が定義されていないことを示すnoticeが表示されます.最初は3元式()で変数ごとにデフォルト値を設定すると考えられていましたが、この書き方は煩雑でvoltラベルと合わないことがわかりました.あとで屏蔽E_を思い出したNOTICEレポートですが、開発環境ではまだ不適切です.最後にvoltエンジンにフィルタFilters機能があることを発見し、この問題を解決した.書き方は{{var|default('str')}}、$varが空の場合、そこをstrに設定し、もちろんstrは空の文字列であってもよい.フィルタとは何か、フィルタをカスタマイズする方法について説明します.
第一に、テンプレートは何をレンダリングしますか?voltテンプレートエンジンを使用する場合、テンプレートはどのようにレンダリングされますか?コントローラメソッドの実行が完了すると、フレームワークはビューViewを自動的にレンダリングしますが、voltテンプレートエンジンを使用しているため、中特有のラベル構文がphp構文ではないため、ビューは直接includeテンプレートファイルとしてphpスクリプトとして解釈できません.このときビューは、テンプレートコードのラベルをphpコードに置き換えてテンプレートキャッシュファイルに保存します.キャッシュ位置はdiでビューを構成するときに自分で設定します.各キャッシュファイルはテンプレートファイルに対応しています.2回目のレンダリングビューでは、voltラベルを解析するたびにキャッシュファイルを直接取ります.したがって、パフォーマンスは元のphpテンプレートと差がなく、レイアウトやテンプレートの継承時に多層テンプレートが1つに統合され、ファイルの読み取り回数が減少する場合があります.
第二に、ラベル「原形」{{var|default('str')}}が変換されたのはなぜですか.テンプレートキャッシュを観察すると、このラベルは大体

<?php echo (empty($var) ? ('str') : ($var)); ?>

第三に、パイプ'|'を理解してshellの友达を熟知するこの一歩は一目で明らかにして、ラベルの作用のメカニズムは:$varの値を次のフィルタdefault処理に伝えて、フィルタはまた他のパラメータを付加することができて、関数の呼び出しのようにパラメータを増やすだけで、上述の('str');変数タイプのラベルは最終的にecho文に変換されます.
第四に、カスタムフィルタは公式マニュアルを通じて、diにvoltテンプレートエンジンを登録するときに、カスタムfilterメソッドを追加して、まずコードを見ることができます.

//volt      
$di->set('voltService', function($view, $di) {
    $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
    $volt->setOptions(array(
        "compiledPath" => APP_PATH."/runtime/volt/",
        "compiledExtension" => ".compiled"
    ));
    //      
    $compiler = $volt->getCompiler();
    $compiler->addFilter('int', function($resolvedArgs, $exprArgs) {
        return 'intval(' . $resolvedArgs . ')';
    });
    return $volt;
});

まずgetCompilerで「コンパイラオブジェクト」$compilerを入手し、$compilerでaddFilterでカスタムフィルタを追加します.上のコードには、$varの値を整形に変換する「int」というフィルタが追加されています.
第五に、voltテンプレート解析時にラベル{{var|int}}がある場合、$compilerはオブジェクトにintフィルタがあるかどうかをチェックし、明らかにある場合、匿名関数を呼び出し、戻り値文字列をechoに配置し、上述したように定義されたintフィルタを返し、最終的にはintval($val)に置き換えられることを理解する.

<?php echo intval($val);?>

その後、PHPによって解釈され、htmlコードがブラウザに返されます.詳細:$resolvedArgsとは何ですか?これは変数名と追加パラメータの接合であり、例えば上のintに追加パラメータがない場合、その値は'$var'であり、ここでは元の意味文字列であり、変数として扱わないことに注意してください.フィルタtrimを定義し,{{var|trim('%')}}の結果をtrim($val,'%')の値にしたいとすると,フィルタ匿名関数を定義する際にこのように書く必要がある.

$compiler->addFilter('concat', function($resolvedArgs, $exprArgs) {
    return 'trim('.$resolvedArgs.')';
});
return $volt;

すなわち、$resolvedArgsという変数の値は、$val,'%'であることに注意してください.ここでは元の意味の文字列であり、便利さを表すために、両側の単一引用符を省略し、$var変数名は永遠に先頭にあります.最終ラベルがphpコードに置き換えられます:<?php echo trim($val,'%');?>で$exprArgsは何ですか?各パラメータのタイプ、オリジナル文字列、所属スクリプトなどを保存した配列ですが、一般的には使用できませんが、特殊な場合に使用する可能性があります.たとえば、組み込まれたdefaultフィルタは、default(')でパラメータを指定したときにempty($var)?':$varここでは$exprArgsから各パラメータの情報を得る必要がある.
カスタムテンプレート関数も同様の原理で、ラベルをphpコードに変換し、テンプレートキャッシュに保存することを目的としています.
感言:テンプレートエンジンは神秘的ではなく、その動作メカニズム、コード実現原理を理解すれば、誰もが自分のテンプレートエンジンを実現することができます.