アプリケーションのさまざまな場所で、同一のデータベースクエリと同一の関連 HTML を繰り返す状況があります。
では、これを DRY する通常の/ベストプラクティスの方法は何ですか?
この状況ではインクルードは完全に機能しますが、それを DRYing の方法として採用すると、最終的にインクルードが多すぎてアプリの速度が低下する可能性がありますか?
私は通常、繰り返されるブロックのエコーを処理する静的メソッドを使用してユーティリティクラスを作成します。たとえば、私のクラスを見てくださいsocial plugins
データベースクエリ用の中央ファイルを用意し、必要な場所にのみ含めることを試みることができます。HTMLフラグメントについても同様です。
この場合、MVCパターンが役立つことがあります(http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controllerを参照) 。
完全なフレームワークを使用せずに、少なくとも部分的に独自に開発したい場合は、確立されたライブラリをいくつか組み合わせて、ロジックをテンプレートから切り離すことができます。
たとえば、私が行っているのは、十分に確立されたテンプレート エンジンである Smarty を使用し、その基本クラスを拡張して安価なクエリを実行することです。
通常、ロジックをテンプレートから分離して、この方法で Smarty を使用します。
$Smarty = new Smarty();
$Smarty->assign( 'myvariable', array( ... ) ); // usually a database query return
$Smarty->display( 'template.tpl' );
だから私はクエリを実行するためにそれを拡張しました:
class QSmarty extends Smarty {
function query( $sql ) {
$args = func_get_args();
$sql = array_shift( $args );
foreach( $args as $k => $v ) $args[$k] = mysql_escape_string( $v );
$safe_sql = vsprintf( $sql, $args );
// assuming this will be manageable (paginated or reasonably sized)
$ret = array();
$t = mysql_query( $safe_sql );
while( $r = mysql_fetch_assoc( $t ) ) {
$ret[] = $r;
}
return( $ret );
}
}
したがって、これを何度も怠惰に使用できます。
$Smarty = new QSmarty();
$Smarty->assign( 'users', $Smarty->query(
"select * from users where group=%s",
$_GET['group'] // gets sanitized automatically
));
$Smarty->display( 'users.tpl' );
テンプレート ファイル users.tpl は次のようになります。
<ul>
{foreach $users as $user}
<li class="{cycle values='odd,even'} {if $user@last}last_user{/if}">
{$users.id}: {$users.username|lower}
</li>
{/foreach}
</ul>
Smarty はテンプレートの継承、カスタム テンプレート関数、およびその他の機能のネストをサポートしているため、再利用可能な HTML を独自の個々のファイルに分割し、他のテンプレート内で {include users.tpl} などのテンプレート マークアップを使用して、ご覧のように変数を割り当ておよび再割り当てすることができます。フィット。とても乾いた。
実を言うと、これはほとんど Smarty のセールス ピッチであり、その機能の一部だけをデモンストレーションまたは強調しています。クエリはさておき、Smarty はここで面倒な作業をすべて行っています。それに、または別のテンプレート エンジンを試してみてください。