ビューとコントローラーの分離

これは何ですか



プログラマーの多くは、コントローラー(またはビジネスロジック)をタイプ(または表示ロジック)から分離する必要性を理解していると思います。 これにより、スキンのサポート、再設計、および実装が簡素化されます。 この不名誉には非常に多くの認識があり、5セントを挿入したいと思います:)

このトピックに関する膨大な数のトピックを見つけることができますが、主にそれらは「外観」、またはむしろあらゆる種類のテンプレートエンジンに関連しています。 私は今それについて話さないでしょう、さもなければそれは別のホリバーに変わります。 この記事のトピックはコントローラーであり、むしろ私の実装ですが、表示も適用されます:)。

どこかに似たようなものがあれば、ソースを指摘してくれて感謝します。



これはなぜですか?



ソフトウェアシステムをプログラマモジュールに分割することに加えて、コードの再利用も重要です。同じことを20回記述したり、コピーと貼り付けを使用したりしないため、エラーが発生します。

今何があるの?



ページには非常に多くの共通点があるため、次のようなことがよくあります。

 {?php include "header.php"?}
いくつかのコンテンツ
 {?php include "footer.php"?}


または

ヘッダー
 {?php include "{$ module} .php"?}
フッター


最初のアプローチの欠点は明らかで、2番目のアプローチはコントローラーの観点からはあまり良くありません

どう?



考え方は、オブジェクト指向のアプローチを使用することです(PHPには関数のオーバーロードがないため)

 {?php#メインコントローラー

クラスMain_Cntr {
     function render(){
         #いくつかのロジック
         include 'main.tpl';
     }
    関数の内容(){
         #いくつかのロジック
         include 'default_content.tpl';
     }
    汎用モジュール(){
         #いくつかのロジック
         include 'default_module.tpl';
     }
 };


これで、整数テンプレートmain.tpl



直接指示があります。

 ...ヘッダー...
 {?php $ this-> content()?}
 ...いくつかのビュー...
 {?php $ this-> module()?}
 ...フッター...


このアプローチの利点は、子孫を生成するページの階層を構築できることです。

 {?php#メインコントローラー

クラスOther_CntrはMain_Cntrを拡張します{
    関数の内容(){
         #他のロジック
         include 'other_content.tpl';
     }
 };


この場合、ベースビューとコントローラーのすべてのプロパティが継承されるため、変更、コントローラー、ビューに個別に直接関連する最小限のコードを記述する必要があります。

おわりに



当然、実装の詳細は変更できます。ここでは、任意のテンプレートエンジンを使用できます。

  1. テンプレートのコードは完全に読みやすく、理解しやすいままです-ページの論理要素の抽象的なマーキングが使用されます。

    コントローラーのコードも明確でシンプルであり、同様のテンプレートとページ上の繰り返し要素の作成が簡素化されています。



    建設的なコメントとコメントを歓迎します。

    PS:多かれ少なかれ兆候、いくつかの不具合のため、ブレースを掲示する必要があった。



All Articles