MVC パターンは、Web サイトのアーキテクチャでは非常に一般的です。これにより、3 層アプリケーションを構築できるようになり、有用な層がコードから分離され、設計者と開発者の共同作業が容易になり、既存のアプリケーションを保守および拡張する能力が向上します。
ビュー
「ビュー」とは主に、スクリプトによって生成された HTML など、Web ブラウザーに送信される最終結果を指します。ビューについて話すとき、多くの人はテンプレートを思い浮かべますが、テンプレート ソリューションをビューと呼ぶのが正しいかどうかは疑問です。
おそらくビューに関して最も重要なことは、ビューがレンダリングされるときに、その要素がより大きなフレームワーク内での役割を認識している必要があることです。
XML を例にとると、XML が解析されるとき、DOM API は、DOM ツリー内のノードが XML がどこにあるか、何が含まれているかを認識するような知識を持っていると言えます。 (XML ドキュメント内のノードが SAX で解析される場合、それはノードが解析されるときにのみ意味を持ちます。)
ほとんどのテンプレート スキームは、次のような単純な手続き型言語とテンプレート タグを使用します:
<p>{some_text}</p >
<p>{some_more_text}</p>
これらはドキュメント内では何の意味もありません。意味するのは、PHP がそれを別のものに置き換えることだけです。
このビューの大まかな説明に同意する場合は、ほとんどのテンプレート ソリューションがビューとモデルを効果的に分離していないことにも同意することになります。テンプレート タグは、モデルに格納されているものに置き換えられます。
ビューを実装するときに、次のような質問を自問してください。「ビュー全体を置き換えるのは簡単ですか?」「新しいビューを実装するのにどのくらい時間がかかりますか?」「ビューの記述言語を置き換えるのは簡単ですか?」同じビューで SOAP を使用する ドキュメントは HTML ドキュメントを置き換えます)」
モデル (Model)
モデルはプログラム ロジックを表します。 (エンタープライズ レベルのプログラムではビジネス層と呼ばれることがよくあります)
一般に、モデルのタスクは、元のデータを、ビューによって表示される何らかの意味を含むデータに変換することです。通常、モデルは、クエリを実装するための抽象データ クラス (データ アクセス層) を介して、データ クエリをカプセル化します。たとえば、英国の年間降雨量を計算したい場合 (素敵な休暇の場所を見つけるためだけに)、モデルは 10 年間の毎日の降雨量を受け取り、平均を計算し、それをビューに渡します。
コントローラー (コントローラー) は、
コントローラーが Web アプリケーションの受信 HTTP リクエストの最初の部分であることを単に意味します。一部の GET 変数など、受信したリクエストをチェックし、適切なフィードバックを行います。最初のコントローラーを作成するまでは、他の PHP コードを書き始めるのは困難です。最も一般的な使用法は、index.php の switch ステートメントのような構造です:
<?php
スイッチ ($_GET['viewpage']) {
ケース「ニュース」:
$page=新しい NewsRenderer;
壊す;
ケース「リンク」:
$page=新しいLinksRenderer;
壊す;
デフォルト:
$page=新しいHomePageRenderer;
壊す;
}
$page->display();
?>
このコードには手続き型コードとオブジェクト指向コードが混在していますが、小規模なサイトの場合は通常、これが最良の選択です。ただし、上記のコードはまだ最適化できます。
コントローラーは実際には、モデルのデータとビュー要素の間のバインディングをトリガーするために使用されるコントロールです。
例
MVC パターンを使用した簡単な例を次に示します。
まず、通常のクラスであるデータベース アクセス クラスが必要です。
<?php
/**
* MySQL をクエリするための単純なクラス
*/
クラス DataAccess {
/**
*プライベート
* $db にはデータベースリソースが格納されます
*/
変数$db;
/**
*プライベート
* $query にはクエリ リソースが格納されます
*/
var $query; // クエリリソース
//!
/**
* 新しい DataAccess オブジェクトを構築します
* @param $host string データベースサーバーのホスト名
* @param $user string データベースサーバーユーザー
* @param $pass string dbserver ユーザーのパスワード
* @param $db string データベース名
*/
function DataAccess ($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$this->db);
}
// アクセサ
/**
* クエリリソースを取得し、ローカルメンバーに保存します
* @param $sql string 実行するデータベース クエリ
* @return void
*/
関数 fetch($sql) {
$this->query=mysql_unbuffered_query($sql,$this->db); // ここでクエリを実行します。
}
// アクセサ
/**
* クエリ行の連想配列を返します。
* @return 混合
*/
関数 getRow() {
if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
$row を返します。
それ以外
false を返します。
}
}
?>
その上に模型を置きます。
<?php
/**
* データベースから「製品」を取得します
*/
クラス ProductModel {
/**
*プライベート
* $dao DataAccess クラスのインスタンス
*/
var $dao;
//!
/**
* 新しい ProductModel オブジェクトを構築します
* @param $dbobject DataAccess クラスのインスタンス
*/
関数 ProductModel (&$dao) {
$this->dao=& $dao;
}
//!
/**
* このクエリをリソースとして保存するように $dboject に指示します
* @param $start 開始する行
* @param $rows フェッチする行数
* @return void
*/
関数 listProducts($start=1,$rows=50) {
$this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows);
}
//!
/**
* このクエリをリソースとして保存するように $dboject に指示します
* @param $id 行の主キー
* @return void
*/
関数 listProduct($id) {
$this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
}
//!
/**
* $dbobject から製品を連想配列として取得します
* @return 混合
*/
関数 getProduct() {
if ( $product=$this->dao->getRow() )
$product を返します。
それ以外
false を返します。
}
}
?>
注意すべき点の 1 つは、モデルとデータ アクセス クラスの間の対話は決して 1 行以上ではないということです。複数行は送信されないため、プログラムの速度がすぐに低下します。同じプログラムは、スキーマを使用するクラスのメモリに 1 つの行 (行) を保持するだけで済みます。残りは保存されたクエリ リソース (クエリ リソース) に与えられます。つまり、MYSQL に結果を保持させます。
次はビューです。スペースを節約するために HTML を削除しました。完全なコードはこの投稿で確認できます。
<?php
/**
* 製品データを HTML レンダリングにバインドします
*/
クラス ProductView {
/**
*プライベート
* $model ProductModel クラスのインスタンス
*/
var $model;
/**
*プライベート
* $output レンダリングされた HTML は表示のためにここに保存されます
*/
var $output;
コンストラクター。
/**
* 新しい ProductView オブジェクトを構築します
* @param $model ProductModel クラスのインスタンス
*/
関数 ProductView (&$model) {
$this->model=& $model;
}
//!
/**
* HTML ページの上部を構築します
* @return void
*/
function header () {
}
//!
/**
* HTML ページの下部を作成します
* @return void
*/
function footer () {
}
//!
/**
* 単一の製品を表示します
* @return void
*/
関数 productItem($id=1) {
$this->model->listProduct($id);
while ( $product=$this->model->getProduct() ) {
// データを HTML にバインドします
}
}
//!
/**
* 製品テーブルを構築します
* @return void
*/
関数 productTable($rownum=1) {
$rowsperpage='20';
$this->model->listProducts($rownum,$rowsperpage);
while ( $product=$this->model->getProduct() ) {
// データを HTML にバインドします
}
}
// アクセサ
/**
* レンダリングされた HTML を返します
* @戻り文字列
*/
関数表示 () {
$this->output を返します。
}
}
?>
概要: MVC パターンは、Web サイトのアーキテクチャでは非常に一般的です。これにより、3 層アプリケーションを構築できるようになり、有用な層がコードから分離され、設計者と開発者の共同作業が容易になり、既存のアプリケーションを保守および拡張する能力が向上します。この記事では、PHP での MVC パターンの実装について紹介します。
タグ: PHP MVC MVC パターン PHP Web サイト
オラクルは、各物流リンクについて正確な洞察を得るのに役立ちます
オラクルは、各物流リンクについて正確な洞察を得るのに役立ちます。最後に、コントローラーとしてビューをサブクラスとして実装します。
<?php
/**
* アプリケーションを制御します
*/
class ProductController extends ProductView {
//!
/**
* 新しい ProductController オブジェクトを構築します
* @param $model ProductModel クラスのインスタンス
* @param $getvars 受信 HTTP GET メソッド変数
*/
function ProductController (&$model,$getvars=null) {
ProductView::ProductView($model);
$this->header();
スイッチ ( $getvars['view'] ) {
ケース「製品」:
$this->productItem($getvars['id']);
壊す;
デフォルト:
if ( empty ($getvars['rownum']) ) {
$this->productTable();
} それ以外 {
$this->productTable($getvars['rownum']);
}
壊す;
}
$this->フッター();
}
}
?>
これが MVC を実装する唯一の方法ではないことに注意してください。たとえば、コントローラーを使用してモデルを実装し、同時にビューを統合することもできます。これはパターンを示す 1 つの方法にすぎません。
Index.php ファイルは次のようになります:
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');
$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& 新しい ProductModel($dao);
$productController=& 新しい ProductController($productModel,$_GET);
echo $productController->display();
?>
美しくシンプル。
コントローラーを使用するためのいくつかのトリックがあります。PHP では次のようにすることができます。
$this->{$_GET['method']}($_GET['param']);
1 つの提案は、プログラムの URL 名前空間フォームを定義することです
。(名前空間) の場合、さらに標準化されます。例:
"index.php?class=ProductView&method=productItem&id=4"
それを通じて、次のようにコントローラーを処理できます。
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
開発速度と適応性をトレードオフする場合など、コントローラーの構築が難しい場合があります。インスピレーションを得るのに最適な場所は、Apache グループの Java Struts です。この Java Struts のコントローラーは完全に XML ドキュメントによって定義されています。