web-dev-qa-db-ja.com

PHPでテンプレートシステムを使用する必要があるのはなぜですか?

PHPでテンプレートシステムを使用する必要があるのはなぜですか?

私の質問の背後にある理由は次のとおりです。PHP自体は機能豊富なテンプレートシステムですが、なぜ別のテンプレートエンジンをインストールする必要があるのですか?

私がこれまでに見つけた2つの長所は次のとおりです。

  1. 少しすっきりした構文(時々)
  2. テンプレートエンジンは通常、ビジネスロジックを実装するのに十分なほど強力ではないため、関心の分離を余儀なくされます。 PHPを使用してテンプレートを作成すると、テンプレートの原則を歩き回って、コードスープの作成を再開できます。

...そして、短所と比較すると、どちらもごくわずかです。

小さな例:

[〜#〜] php [〜#〜]

<h1><?=$title?></h1>
<ul>
  <? foreach ($items as $item) {?>
  <li><?=$item?></li>
  <? } ?>
</ul>

Smarty

<h1>{$title}</h1>
<ul>
  {foreach item=item from=$items}
  <li>{$item}</li>
  {/foreach}
</ul>

まったく違いはありません。

58
Josef Sábl

はい、あなたが言ったように、PHP(テンプレートエンジン)内でテンプレートエンジンを使用することを強制しないと、簡単に滑り、関心の分離をやめることができます。

ただし、関心の分離に問題がある同じ人々は、HTMLを生成してsmartyにフィードするか、PHP Smartyでコードを記述しているため、Smartyは関心の分離の問題をほとんど解決していません。

参照:

26
Kent Fredric

人々がテンプレートシステムを使用する主な理由は、ロジックをプレゼンテーションから分離することです。それから来るいくつかの利点があります。

まず、テンプレートをWebデザイナーに渡すことができます。ウェブデザイナーは、コードの流れを維持することを心配することなく、適切と思われるものを移動できます。特別なタグをそのままにしておくことを知っているだけで、PHPを理解する必要はありません。彼らはいくつかのタグについていくつかの単純なセマンティクスを学ぶ必要があるかもしれませんが、それは言語全体を学ぶよりもはるかに簡単です。

また、ページを別々のファイルに分割することにより、プログラマーとデザイナーの両方が同じ「ページ」で同時に作業し、競合することなく、必要に応じてソース管理にチェックインできます。デザイナーは、プログラマーが自分のコピーに対して他の、潜在的に破壊的な変更を行っている間に、コードの安定バージョンに対してテンプレートビジュアルをテストできます。しかし、これらの人々が両方とも同じファイルを編集していて、異なる変更をマージする必要がある場合、問題が発生する可能性があります。

また、ビジネスロジックをプレゼンテーションロジックから遠ざけるための優れたプログラミング手法も適用されます。ビジネスロジックをプレゼンテーションと混合すると、後で別の方法でプレゼンテーションを行う必要がある場合に、ビジネスロジックを抽出するのが難しくなります。最近では、RSS/ATOMフィード、JSONまたはAJAX応答、ハンドヘルドデバイス用のWMLなど)のさまざまな表示モードがWebアプリでますます一般的になっています。テンプレートシステムを使用すると、これらを完全に実行できることがよくあります。テンプレートであり、他のものへの変更はないか、ほとんどありません。

ただし、すべての人がこれらのメリットを必要としているわけではありません。 Java/Python/Ruby/etcに対するPHPの利点は、いくつかのロジックを含むWebページをすばやくハックできることです。これはすべてうまくいきます。

17
Kylotan

ロジックを分離する言い訳で非PHPテンプレートを使用することはナンセンスです。開発者がビジネスビューロジックの分離とは何か、およびそれをどのように行うべきかを理解していない場合は、問題に適切に対処する必要があります。そうしないと、ビジネスロジックのHTMLまたはテンプレートのビジネスロジックになってしまいます。テンプレートエンジンで保存することはできません。開発者に基本を教える必要があります。

そして、開発者がdoesそれを理解している場合、テンプレートシステムは単なる制限です。開発プロセスに任意の値を追加せず、新しい構文を学習し、別のライブラリを最新の状態に保ち、実行を遅くするオーバーヘッドのみを追加します。後者はキャッシングなどで解決できますが、これは他の方法では存在しない問題を解決するだけです。したがって、テンプレートシステムには価値がなく、利点もまったくありません。

ただし、PHP以外のテンプレートシステムを使用することが合理的であると私が考える例外が1つあります。それは、ビューロジックプログラマーがテンプレートへのアクセスを制限する必要がある場合です。たとえば、ブログホスティングシステムのプロバイダーであり、ユーザーが任意のコードを実行することを許可せずに、テンプレートをパーソナライズしてコーディングできるようにしたい場合です。ただし、この引数はnot設計者が、UIのプログラミングに役立つ小さなコードを進んで学習する場合に適用されます。彼がSmartyを学ぶことができれば、彼は確かに PHPを学ぶことができます。

12
gasper_k

テンプレートシステムを使用する正当な理由はまだありますが、Smartyではありませんが、 [〜#〜] phptal [〜#〜] です。 PHPTALテンプレートは、有効なXML(したがってXHTML)ファイルです。 PHPTALでダミーコンテンツをさらに使用して、標準ツールで処理およびテストできる最終的な外観の有効なXHTMLファイルを取得できます。ここに小さな例があります:

<table>
  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Age</th>
    </tr>
  </thead>
  <tbody>
    <tr tal:repeat="users user">
      <td tal:content="user/first_name">Max</td>
      <td tal:content="user/last_name">Mustermann</td>
      <td tal:content="user/age">29</td>
    </tr>
  </tbody>
</table>

PHPTALテンプレートエンジンは、ユーザー配列からすべての値を自動的に挿入し、ダミー値を置き換えます。それにもかかわらず、テーブルはすでに有効なXHTMLであり、選択したブラウザーで表示できます。

9
Vadim Ferderer

私にとって、テンプレートエンジンの大きな特徴の1つは、キャッシュレイヤーが透過的であることです。私はずっと前にsmartyを使用してきました、そしてキャッシュのものは人生を楽にします。また、スマートなデザインにより、独自のキャッシュ機能を使用できます。私の場合、一部のページでmemcacheまたはdiskを使用してテンプレート出力を保存するかどうかを選択します。

一方、サイトのトラフィックが多く、スマートに管理して適切に調整する方法がわからない場合は、このテンプレートエンジンがサイトキラーになる可能性があります。しかし、スマートに使用しなくても、サイトが死ぬ可能性があります。

flickrは現在smartyを使用しています。そんなに悪くないはずですよね?

6
Gabriel Sosa

PHP isほとんどテンプレートシステムです。重要なのは、自分でロジックをプレゼンテーションから分離するように強制することです。 Smartyなどを使用すると、ロジックとプレゼンテーションを組み合わせるのが少し不便になります。自分でそれらを分離することができない場合は、テンプレートシステムを使用しても役に立ちません。追加の処理能力を消費するだけです。

重要なのは、プレゼンテーションコードの値を変更しないことです。これを行うには、if/endif構文を使用すると、PHP自体がSmartyと同じくらい効果的だと思います。

<?php if($some_test): ?>
   <em>Some text!</em>
<?php endif; ?>
5
Wickethewok

ほとんどの場合、「安全でない」バックエンドロジックがテンプレートに適用されるのを避けると思います。ほとんどの場合、テンプレートはデザイナーに渡されるため、デザイナーが実行できる一連のクローズドセットのみをデザイナーに提供したいと考えています。

4
Luca Matteis

任意のPHPファイルから任意のテンプレートを簡単に表示する機能が好きです(ナビゲーションバーなどの一般的な要素のために、テンプレートのフラグメントを相互に含めます)。たとえば、通常のページがあるとします。ログインしている場合はいくつかの情報を出力し、ログインしていない場合はエラーを出力します。PHPでは、次のように記述します。

if (loggedIn)
{
    // print lots of HTML here
}
else
{
    // print error message
}

Smartyでは、次のようになります(おそらく間違った構文を許してください、しばらく経ちました):

if (loggedIn)
{
    $smarty->bind("info", someObject);
    $smarty->display("info.template");
}
else
    $smarty->display("error.template");

本当に賢い場合は、エラーテンプレートの代わりにログインページテンプレートを表示することもできます。オプションで、ユーザーがそこにたどり着いた理由を説明するメッセージを表示することもできます。そして、私が書いたテクニックを使用して、ログインボックスの表示に切り替えたいと思った場合、それは1行の変更だけです!私にとって、それはビューとロジックの分離を維持することだけではなく、多くの場所からビューの共通要素を再利用する機能についてです。

3
rmeador

htmlspecialchars()を2回忘れました。そのため、テンプレートシステムが必要です。

Smartyは貧弱です。それに基づいてテンプレートシステムを判断しないでください。

2
Kornel

コードイグナイターのようなMVCフレームワークを使用して満足しています。 「ビュー」では、値の表示方法のみに関連するphpコードに固執する傾向があることがわかりました。そのためにビューで使用できるフォーマット関数のライブラリがあります。コードイグナイターの前提の1つは、テンプレート言語を回避することです。これは、テンプレート言語がユーザーを制限し、速度が低下する可能性があるためです。

設計者がPHPを習得して、必要なことを達成できるようにする方がよいと思います。クラス名を交互に。また、長期的にはそれらがより便利になり、ある構文から別の構文への大きな飛躍ではありません。

2
roborourke

私が見なかったテンプレートエンジンの利点の1つは、動的html要素(asp.netコントロールなど)の可能性でした。たとえば、PEARのHTMLテンプレートFlexyを使用すると、状態を自動的に維持する動的フォーム要素を使用できます。通常のhtmlselect要素にデータを入力し、テンプレートにループや条件を設定せずに、選択したアイテムをコードビハインドに設定できます。

1
rick

よりクリーンな構文は非常に大きなメリットだと思います。ほんの数文字のように見えるかもしれませんが、毎日それを行うと、各文字がカウントされ始めます。

そして、_{$myvar|escape}_は<?php echo htmlspecialchars($myvar); ?>よりもかなり短いIMHOです。 (_<?=$foo?>_構文は、PHP conf。)で特別に有効になっている場合にのみ使用できることに注意してください。

1
Rene Saarsoo

あなたの分析は合理的です。私は考えます:

  • テンプレートデザイナーとバックエンドプログラマーは同じではないかもしれないので、それは分離を促進します。
  • テンプレートで「多すぎる」PHP)を実行できないという点で、自分自身からある程度保護されます。
  • 一部のシナリオでは、テンプレートを最適化/プリコンパイルする方が簡単な場合がありますか? (これは推測です)

個人的には、彼らは価値があるよりも面倒だと思います。特に、WYSIWYGツールはテンプレートをどう処理するかわからないため、テンプレートを「デザイナー」に渡したい場合は機能しません。

1
Draemon

そして未来を忘れないようにしましょう。ウェブサイトは公開された瞬間に古くなります。ある時点でルックアンドフィールを更新する必要があります。多くの場合、分離を維持する場合、デザイナーだけで、バックエンドで同じプログラミングを使用してまったく新しいWebサイトを完成させることができます。これにより、より高速で安価な再設計が可能になり、新しい機能が必要な場合にのみプログラマーを関与させることができます。

1
UberDragon
  • PHPコードをテンプレートとして使用するファイルを使用しますか?問題ありません。
  • 上記のテンプレートで変数を使用しますか?結構です。

ロジックと最終出力(プレゼンテーション)を分離することを忘れないでください。これは、テンプレートフレームワークを使用するとより適切に実現されます。しかし、Smartyのようなことを学ぶ必要はありません。

  • Zend_Viewまたは同様のものを使用する場合は、PHPコードをずっと使用できます。

ここの多くの人々は正しい答えを持っています。 SmartyはPHPでテンプレートを作成していません。それからは程遠い。 Smartyは主に、ページの表示を編集および設定するためにデザイナー(つまり、プログラマー以外)を使用する必要がある人のためにあります。ページのレイアウトを変更するすべての人がプログラムできる場合は、より多くのPHPコード指向のテンプレートシステムを使用できます。ただし、実際にはすべての出力データを準備して、に送信する必要があります。テンプレート。各ページにコンテンツのフェッチ、処理、表示を許可する場合は、早めにリファクタリングする必要があります。

1
OIS

テンプレートエンジンを使うべきではないと思います。代わりに、 Zend_View のようなものを使用する必要があります。これは、プレゼンテーションとは別のロジックを実行することを推奨しますが、PHPでプレゼンテーション層を構築することを可能にします。

1
Zoredache

他の誰かのためにコードを書いているとき。たとえば、私はかつて、顧客向けにカスタマイズできる厳格なWebアプリケーションフレームワークの作成に携わっていました。重要な要求の1つは、顧客が設計者を雇ってテンプレートを変更し、プログラミングできなくてもできることでした。さらに重要なのは、彼がコードを変更することを許可していない可能性があることです。

たとえば、Smartyを使用すると、テンプレートの機能に非常に厳しい制限を実装できます。基本的に、アプリケーションは、最も基本的なコード構造と選択された修飾子関数のセットを除くすべてを無効にしました。したがって、テンプレートエンジンによって適切に機能する2つの目標がありました。simplicitysecurityです。

1
Konrad Rudolph

SmartyはPHPですでにできること:プレゼンテーションをビジネスロジックから分離することを行うと主張する人もいるかもしれません。PHPプログラミング言語はコード開発に最適ですが、 HTMLの場合、PHPステートメントの構文は管理が面倒になる可能性があります。Smartyは、はるかに単純なタグベースのプレゼンテーションからPHPを分離することで、これを補います。構文。タグはアプリケーションのコンテンツを明らかにし、PHP(アプリケーション)コードからの明確な分離を強制します。Smartyテンプレートを管理するためにPHP知識は必要ありません。

この分離の重要性は状況に応じて異なります。 PHP開発者よりも、Webデザイナーにとって一般的に重要です。したがって、開発者とデザイナーの役割が分かれている場合、Smartyは一般的に適しています。正しい答えも間違った答えもありません。 Smartyは、コードとテンプレートを管理するための独自の設定を持っています。クリーンなタグベースの構文の他に、Smartyは、プレゼンテーションを管理するためのさまざまなツールも提供します。たとえば、きめ細かいデータキャッシュ、テンプレートの継承、機能的なサンドボックスなどです。ビジネス要件そして、Smartyが使用されているPHPコードは、Smartyが適切かどうかを判断する上で大きな役割を果たします。

1
Mystery

私は何度か tinybutstrong を使用しましたが、これはかなりきちんとした単純な構文です。 htmlテンプレートにループや擬似コードはありません。

彼らのホームページから:

TinyButStrongは、テキストソースに基づいてXML/HTMLページやその他のファイルを動的に作成できるようにするライブラリです。これはPHP言語用のテンプレートエンジンです。データベースからの情報を簡単に表示できるだけでなく、PHPプログラミングを真剣に調和させて簡素化することもできます。

TinyButStrongはHTMLを対象としていますが、Htmlに特化していません。これは、テキストファイル、XML、RSS、RTF、WML、Excel(xml)などでも機能することを意味します。OpenTBSプラグインを使用すると、OpenOfficeドキュメントとMsOfficeドキュメントをマージできます。

0
kle_py

Java/ Spring /Oracle PL-SQLの人々のように、OOPの概念を多用する開発者は、PHP言語自体がプレゼンテーション/ビュー/に使用される)と言います。エンタープライズレベルのプロジェクトの表示ロジック。これらのBIGプロジェクトでは、バックエンドはOracleであり、データベースはpl-slq/Javaを使用してフェッチされ、プレゼンテーションはphpです。最良の例はfacebookです。 http://en.wikipedia。 org/wiki/Facebook facebookはプレゼンテーションにphpを使用し、バックエンドインターフェイスとしてJava/c ++を使用します。

PhpはHTMLと緊密に連携するため、プレゼンテーションとして使用される唯一の理由ですが、Java/c ++はより多くのOOPベースであり、HTMLに直接適合させることはできません。 Smartyを利用するCMS(joomla/drupal/wordpress)またはフレームワーク(zend/symfony/Yii)を1つ教えてください。では、なぜスマートが必要なのですか?

0
Srikanth Ganta

PHPテンプレート言語が強制的に使用するように強制された場合、それをまったく使用しないだろうと私は賭けます。「飛び出し」、あなたのことをする能力困ったときの方法は、PHPの魅力の1つです。

それが良いことだとか、コードが保守可能になるとか言っているわけではありません。最初の検討では、完全にブロックされたテンプレート言語を選択しないというだけです。

それ以外の場合は、テンプレートシステムを使用すると、コーディングと設計の間で作業を分割でき、設計者が設計とコーディングを行えるようになる可能性があることに同意します。

テンプレート管理システムでは、テンプレートファイルを個別に管理できます。システムの実行時間は通常のPHPプロジェクトよりも速くなります。したがって、ここではPHPファイルとテンプレートファイルは別々に維持されます。

ファイルを実行すると、コードはtemplate_cに保存されます。そのため、何度もコンパイルされません。

0
RaJeSh

私は個人的に常にphp、pythonなどでテンプレートエンジンを使用しています。

他の人がすでに述べた最初の明白な理由:

テンプレートでビジネスロジックを使用しないように強制します。

ええ、確かに、あなたがそれを持っているとき、規律はうまくいくでしょう。

しかし、これはテンプレートエンジンを使用する理由のほんの一部です。それらのほとんどは単なるエンジンではなく、好むと好まざるとにかかわらず、テンプレートフレームワークと見なすことができます。

たとえば、Smartyには、部分キャッシュなどの高度なキャッシュ機能もあります。本当に便利なもの、テンプレート言語としてphpだけを使用する場合は、すべて自分で行う必要があります。

また、ドキュメントをすばやく検索するだけで、本当に便利なヘルパー関数をすべて忘れないでください。それらのほとんどは、独自の関数やツールキットをプラグインする簡単な方法も提供します。

そうです、それは選択の問題です。本当に単純なテンプレートが必要な場合は、ロジックをテンプレートに含めないように、いくつかの規律を示すことを検討してください。ただし、アプリケーションの成長が予想される場合は、最終的にテンプレートフレームワークの機能が必要になります。そしてその時までに、あなたはそれをすべてあなたの手でコーディングすることによって車輪を再発明しないことを願っています。

最後になりましたが、私にとって、いくつかのテンプレートフレームワークで利用できるキラー機能が1つあります。

テンプレートの継承

Django から知りましたが、最近では Smarty で使用しています。 Symphonyフレームワークのメンバーも Twig を持っています。これは、Django構文のポートと見なすことができます。

最初は少し奇妙に見えますが、非常に強力です。スケルトンを作成し、さまざまなブロックを定義します。このようなスケルトンを拡張して、ブロックにコンテンツを入力(オーバーライド)することができます。

私にとってそれはキーパーです!

0
Sander Versluys