今日、Habrの日のテンプレートエンジンのPHPから、私が知っているものの中で読みやすいテンプレートを備えた最も柔軟なテンプレートエンジンである
MACROについて話をするしかありません。
その作成の理由は単純です-その時に私たちが使用していた
WACTはますます巨大になりました。
フォーラムで理由と最初のアイデアについて詳しく読むことができます。
主な「チップ」
柔軟性
内部では、通常のphp挿入を簡単に使用できます。テンプレートエンジン自体には、使用するための非常に小さなルールセットが含まれています。 これにより、非常に柔軟なツールが提供され、プルデータアクセスとプッシュデータアクセスの両方がサポートされます。
高いテンプレートの再利用
テンプレートをレイアウトするための強力なツール:同じテンプレート内での折り返し(
wrap )、包含(
include )、再利用(
apply )。 テンプレートマジックの例は
、プロジェクトwikiにあります 。 MACROを使用したおかげで、テンプレートの重複を完全に取り除くことができました。
スピード
元のテンプレートのコードは最初に実行可能なphpスクリプトに変換され、テンプレート
全体が
コンパイルされます 。したがって、合成(テンプレートをパーツに分割、ラッピングなど)は、単一の全体にアセンブルされるため、テンプレート実行の速度にはほとんど影響しません(クラス)、コンパイル中、およびスコープ(コンテキスト)は、コンパイルされたクラスのメソッドを使用して編成されます。 つまり、ほとんどの「重い」操作はコンパイル段階で実行されるか、PHPに組み込まれたツールを使用することで、優れた「速度」インジケーターを実現できます。
拡張性
タグと
フィルターを簡単に
追加できます 。 また、独自のタグまたはフィルターを使用してパッケージ全体を作成する機能もあります。
変更可能性
コンポーネントの凝集力が低く、適切なOOPがあるため、チューニングの柔軟性とドーピングの容易さが実現します。
読みやすさ
テンプレートは、すべての柔軟性にもかかわらず、通常、プログラマではない人が浅いゾンビの後に読んでいます。
タールのビット
MACROは基本的にネイティブPHPの構文糖衣です。 また、レイアウトデザイナーに3か月分の給料を支払わないと、テンプレートのみにアクセスできるようになり、サイト全体が台無しになる可能性があります。
コードを見せてください!
テンプレートの例:
{{ insert into ="content_zone" file ="page.phtml" }}
< img src ={$# photo . largeFileUrl } />
< dl >
< dt > : </ dt >< dd > {$#photo.member.name} </ dd >
< dt > : </ dt >< dd > {$#photo.category.title} </ dd >
< dt > : </ dt >< dd > {$#photo.title} </ dd >
< dt > : </ dt >
< dd >
{{ list using='{$#photo.tags}' as='$tag' }}
< ul >
{{ list:item }}
< li > {$tag.title|uppercase} </ li >
{{ /list:item }}
</ ul >
{{ list:default }}
{{ /list:default }}
{{ /list }}
</ dd >
{{ insert file="photo/marks.phtml"/ }}
</ dl >
{{ /insert }}
*このソースコードは、 ソースコードハイライターで強調表示されました。
タグ
この例の
includeおよび
listはタグです。 一部のタグは他のタグ内にのみ入れることができ、一部のタグには必須属性を含める必要があり、一部の属性には特定の値のみを含める必要があります。 これらはすべてコンパイラーによってチェックされ、エラーの場合には詳細な説明が伴います。
MACROには、リストの表示、テンプレートの作成、リストのページへの分割、ページャーの表示、フォームの操作などを可能にする十分な数のタグが含まれています。
表現
式は、変数値を出力するために使用されます。 この例の式は
{$tag.title|uppercase}
および
{$#photo.largeFileUrl}
です。 テンプレート内の式は、本質的にエコー操作です。 ポイントは、表示された変数へのパスの部分を分離します。 式
{$tag.title}
、
<?php if(isset($tag['title'])) echo $tag['title']; ?>
{$tag.title}
同等
<?php if(isset($tag['title'])) echo $tag['title']; ?>
<?php if(isset($tag['title'])) echo $tag['title']; ?>
式については、「
式」セクションで詳しく説明します。
フィルター
フィルターは、式に表示される値を変更/フォーマットするために使用されます。 この例のフィルター式は
{$tag.title|uppercase}
です。 大文字フィルター-値を大文字に変換します。 本質的に、これは式で指定された変数に使用されるstrtoupper php関数のエイリアスです。
通常、フィルターは一般的に使用されるphp関数のラッパーです。 ただし、独自のフィルターを作成することを妨げるものはありません。これは非常に簡単だからです。 たとえば、数日前、たまたま番号(1人、2人など)に応じて名詞を傾斜させるフィルタを追加しました。
速度について少し
一連のテストなしで高速に注目したテンプレートエンジンを開発することは意味がありません。 つまり、「戦闘」に近いレイアウトでは、MACROは純粋なPHPよりも1.75倍遅くなりますが、最も近い「人間」のテンプレートエンジン(スマート)よりも1/3速くなります。
詳細なテスト結果は、
対応するページで表示(およびダウンロード)でき
ます 。