ホームページ >バックエンド開発 >PHPチュートリアル >PHP実装を使用したMVCスキーム
http://www.phpe.net/articles/382.shtml
MVC パターンは、Web サイトのアーキテクチャでは非常に一般的です。これにより、3 層アプリケーションを構築できるようになり、有用な層がコードから分離され、設計者と開発者の共同作業が容易になり、既存のアプリケーションを保守および拡張する能力が向上します。
View
「View」とは主に、Web ブラウザに送信する最終結果を指します。たとえば、スクリプトによって生成された HTML です。ビューについて話すとき、多くの人はテンプレートを思い浮かべますが、テンプレート ソリューションをビューと呼ぶのが正しいかどうかは疑問です。おそらく、ビューに関して最も重要なことは、ビューがレンダリングされるときに、ビューの要素がより大きなフレームワーク内での役割を認識している必要があることです。
XML を例に挙げると、XML が解析されるとき、DOM API はそのような知識を持っていると言えます?? DOM ツリー内のノードは、XML がどこにあるのか、何が含まれているのかを知っています。 (XML ドキュメント内のノードが SAX で解析される場合、そのノードが解析される場合にのみ意味を持ちます。)
テンプレート スキームの大部分は、次のような単純な手続き型言語とテンプレート タグを使用します。
<p>{some_text}</p> <p>{some_more_text}</p>
それらはin ドキュメントでは意味がありません。意味するのは、PHP がそれを別のものに置き換えるということだけです。
ビューに関するこの大まかな説明に同意する場合は、ほとんどのテンプレート ソリューションがビューとモデルを効果的に分離していないことにも同意することになります。テンプレート タグは、モデルに格納されているものに置き換えられます。
ビューを実装するときは、次のような質問を自問してください。「ビュー全体を置き換えるのは簡単ですか?」「新しいビューを実装するのにどのくらい時間がかかりますか?」「ビューの記述言語を置き換えるのは簡単ですか?」例)同じビュー内)HTML文書をSOAP文書に置き換える)"
Model(モデル)
Modelはプログラムのロジックを表します。 (エンタープライズ レベルのプログラムではビジネス層と呼ばれることがよくあります) 一般に、モデルのタスクは、元のデータを、ビューによって表示される特定の意味を含むデータに変換することです。通常、モデルは、クエリを実装するための抽象データ クラス (データ アクセス層) を介して、データ クエリをカプセル化します。たとえば、英国の年間降雨量を計算したい場合 (素敵な休暇の場所を見つけるためだけに)、モデルは 10 年間の毎日の降雨量を受け取り、平均を計算し、それをビューに渡します。
コントローラー
簡単に言えば、コントローラーは、Web アプリケーションに入る HTTP リクエストによって呼び出される最初の部分です。一部の GET 変数など、受信したリクエストをチェックし、適切なフィードバックを行います。最初のコントローラーを作成するまでは、他の PHP コードを書き始めるのは困難です。最も一般的な使用法は、index.php の switch ステートメントのような構造です。
<p> </p> <p class="sycode"> 代码 <p class="sycode"> <p class="sycode"> 1 <? php 2 switch ( $_GET [ ' viewpage ' ]) { 3 case " news " : 4 $page = new NewsRenderer; 5 break ; 6 case " links " : 7 $page = new LinksRenderer; 8 break ; 9 default : 10 $page = new HomePageRenderer; 11 break ; } 12 $page -> display(); ?> </p> </p> </p><p> </p>这段代码混用了面向过程和对象的代码,但是对于小的站点来说,这通常是最好的选择。虽然上边的代码还可以优化。控 制器实际上是用来触发模型的数据和视图元素之间的绑定的控件。例子这里是一个使用MVC模式的简 单例子。首先我们需要一个数据库访问类,它是一个普通类。
代
1 33dd6f7a1ed0f4ccf14683b7848a616b db = mysql_pconnect ( $host , $user , $pass );
26 mysql_select_db ( $db , $this -> db);
27 }
28 // ! アクセサ
29 /* *
30 * クエリリソースを取得し、ローカルメンバーに保存します
31 * @param $sql string 実行するデータベースクエリ
32 * @ return void
33 */
34 function fetch( $ SQL ) {
35 $this ->クエリ = mysql_unbuffered_query ( $sql , $this -> db); // ここでクエリを実行します
36 }
37 // ! アクセサー
38 /* *
39 * クエリ行の連想配列を返す
40 * @return mixed
41 */
42 getRow () {
43 if ( $row = mysql_fetch_array ( $this -> クエリ、MYSQL_ASSOC) )
44 return $row ;
45 else
46 return false ;
47 }
48 }
49 ?>
50
ある点に注意してください、モデルとデータアクセスの種類の間に、それらのやり取りは複数回送信されることはありません?? 送信されず、会議は非常に早く進行します。同様に、モードを使用するタイプのプログラムでは、内部保存中に行 (Row) を保持するか?? 他のやり取りが保持しているクエリ リソース (クエリ リソース)?? 置換句を要求し、MYSQL の代わりに結果を保持します。
次は図ですか?? スペースを節約するために HTML を削除しました。この条文の完全なコードを閲覧できます。
代
8f4d44afaefff56be116d98e30109cb8モデル -> listProduct( $id );
while ( $product = $this ->model ->getProduct() ) {
// データを HTML にバインドします
}
// ! マニピュレーター
/* *
* product テーブルを構築します
* @return void
*/
function productTable( $rownum = 1 ) {
$rowsperpage = ' 20 ' ;
$this ->モデル -> listProducts( $rownum , $rowsperpage );
while ( $product = $this ->model ->getProduct() ) {
// データを HTML にバインドします
} // ! アクセサ
/* *
* レンダリングされた HTML を返します
* @return string */
function display () {
return $this ->出力;
}
}
?>
最後にコントローラー、ビューをサブクラスとして実装します。
コード
1 e94c2606836fc6a18c53fc068b869257 [ ' id ' ])
18 ) {
21
22休憩
25 }
26 $this ->
27 }
28 }
29 ?>
30
index.php ファイルは次のようになります:
コード
<p class="sycode"> <p class="sycode"> 1 $this -> { $_GET [ ' method ' ]}( $_GET [ ' param ' ]); </p> </p><p> </p>
一个建议是你最好定义程序URL的名字空间形式(namespace),那样它会比较规范比如:
<p class="sycode"> <p class="sycode"> 1 " index.php?class=ProductView&method=productItem&id=4 " </p> </p><p> </p>
通过它我们可以这样处理我们的控制器:
<p class="sycode"> <p class="sycode"> 1 $view = new $_GET [ ' class ' ]; 2 $view -> { $_GET [ ' method ' ]( $_GET [ ' id ' ]); </p> </p><p> </p>
有时候,建立控制器是件很困难的事情,比如当你在开发速度和适应性之间权衡时。一个获得灵感的好去处是Apache group 的Java Struts,它的控制器完全是由XML文档定义的。