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

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

Source: https://habr.com/ru/post/J45311/


All Articles