MACRO-人間の顔を持つ柔軟なPHPテンプレートエンジン

今日、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速くなります。



詳細なテスト結果は、 対応するページで表示(およびダウンロード)できます






All Articles