ホームページ  >  記事  >  バックエンド開発  >  mvcモードを実装するphpの例

mvcモードを実装するphpの例

WBOY
WBOYオリジナル
2016-07-25 09:05:30946ブラウズ
  1. {some_text}

  2. {some_more_text}

コードをコピー

これらはドキュメントでは意味がありません。 PHP はそれを別のものに置き換えます。

ビューに関するこの大まかな説明に同意する場合は、ほとんどのテンプレート ソリューションがビューとモデルを効果的に分離していないことにも同意することになります。テンプレート タグは、モデルに格納されているものに置き換えられます。

ビューを実装するときは、次のような質問を自問してください。「ビュー全体を置き換えるのは簡単ですか?」「新しいビューを実装するのにどのくらい時間がかかりますか?」「ビューの記述言語を置き換えるのは簡単ですか?」 、SOAP ドキュメントを使用すると HTML ドキュメントが置き換えられます)」

2.モデル

モデルはプログラムロジックを表します。 (エンタープライズレベルのプログラムではビジネス層と呼ばれることが多い)

一般に、モデルのタスクは、元のデータを、ビューによって表示される特定の意味を含むデータに変換することです。通常、モデルは、クエリを実装するための抽象データ クラス (データ アクセス層) を介して、データ クエリをカプセル化します。たとえば、英国の年間降雨量を計算したい場合 (素敵な休暇の場所を見つけるためだけに)、モデルは 10 年間の毎日の降雨量を受け取り、平均を計算し、それをビューに渡します。

3. コントローラー

簡単に言えば、コントローラーは、Web アプリケーションの受信 HTTP リクエストによって呼び出される最初の部分です。一部の GET 変数など、受信したリクエストをチェックし、適切なフィードバックを行います。最初のコントローラーを作成するまでは、他の PHP コードを書き始めるのは困難です。最も一般的な使用法は、index.php の switch ステートメントのような構造です。

  1. switch ($_GET['viewpage']) {
  2. case "ニュース":
  3. $page=new NewsRenderer
  4. break"リンク":
  5. $page=new LinksRenderer; ;
  6. break;
  7. default:
  8. $page=new HomePageRenderer;
  9. }
  10. $page->
  11. コードをコピーします
  12. コードですが、小規模なサイトの場合は通常、これが最良のオプションです。ただし、上記のコードはまだ最適化できます。 コントローラーは実際には、モデルのデータとビュー要素の間のバインディングをトリガーするために使用されるコントロールです。
MVC パターンを使用した簡単な例を次に示します。 まず、通常のクラスであるデータベース アクセス クラスが必要です。

/**

* MySQL をクエリするための単純なクラス
*/
    class DataAccess {
  1. /**
  2. * プライベート
  3. * $db はデータベース リソースを保存します
  4. */
  5. var $db; /
  6. var $query; // リソースのクエリ

  7. * プライベート
  8. * $query はクエリ リソースを保存します
  9. */
  10. function DataAccess ($host,$user,$pass,$db) {
  11. $this->db=mysql_pconnect($host,$user,$pass);
  12. mysql_select_db($db,$this->db);
  13. }

  14. //!アクセサー

  15. /**
  16. * 新しい DataAccess オブジェクトを構築します
  17. * @param $host string データベースサーバーのホスト名
  18. * @param $user string dbserver ユーザー
  19. * @param $pass string dbserver ユーザーのパスワード
  20. * @param $db string データベース名
  21. */
  22. function fetch($sql) {
  23. $this->query=mysql_unbuffered_query($sql,$this->db) // ここでクエリを実行します
  24. }
  25. //! アクセサー

  26. /**
  27. * クエリ リソースを取得し、ローカル メンバーに保存します
  28. * @param $sql string 実行するデータベース クエリ
  29. * @return void
  30. */
  31. function getRow () {
  32. if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
  33. return $row;
  34. else
  35. return false;
  36. }
  37. }
  38. ?>

  39. コードをコピー
  40. その上にモデルを置きます。

    1. /**
    2. * データベースから「製品」を取得します
    3. * リンク: http://bbs.it-home.org
    4. */
    5. class ProductModel {
    6. /**
    7. * プライベート
    8. * $dao DataAccess クラスのインスタンス
    9. */
    10. var $dao;

    11. < p>//!
    12. /**
    13. * 新しい ProductModel オブジェクトを構築します
    14. * @param $dbobject DataAccess クラスのインスタンス
    15. */
    16. function ProductModel (&$dao) {
    17. $this->dao=& $dao;
    18. }

    19. //! マニピュレータ

    20. /**
    21. * このクエリをリソースとして保存するように $dboject に指示します
    22. * @param $start 開始する行
    23. * @param $rows フェッチする行の数
    24. * @return void
    25. */
    26. function listProducts($start=1,$rows=50) {
    27. $this->dao->fetch("SELECT * FROM products LIMIT ".$ start.", ".$rows);
    28. }

    29. //! マニピュレーター

    30. /**
    31. * このクエリをリソースとして保存するように $dboject に指示します
    32. * @param $id 行の主キー
    33. * @return void
    34. */
    35. function listProduct($id) {
    36. $this-> dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
    37. }

    38. //! /

    39. function getProduct() {
    40. if ( $product=$this->dao->getRow() )
    41. return $product;
    42. else
    43. return false
    44. }
    45. }
    46. ?>
    47. コードをコピー
    注: モデルとデータ アクセス クラスの間の対話は 1 行を超えることはありません。複数行が送信されることはありません。これにより、プログラムの速度が急速に低下する可能性があります。スキーマ クラスを使用する同じプログラムの場合、メモリ内に 1 行 (Row) を保持するだけで済みます。残りは保存されたクエリ リソース (クエリ リソース) に与えられます。つまり、MYSQL に結果を保持させます。 次はビューです (次のコードは HTML コンテンツを削除します)。

    /**

  41. * $dbobject から積を連想配列として取得します
  42. * @returnmixed
  43. */
  44. class ProductView {
  45. /**
  46. * 製品データを HTML レンダリングにバインドします
  47. * リンク:http://bbs.it-home.org
  48. */
  49. var $model;

  50. < p>/**
  51. * プライベート
  52. * $model ProductModel クラスのインスタンス
  53. */
  54. var $output;

  55. //! コンストラクター

  56. /**
  57. * プライベート
  58. * $output レンダリングされた HTML は表示のためにここに保存されます
  59. */
  60. function ProductView (&$model) {
  61. $this->model=& $model;
  62. }

  63. //! マニピュレーター

  64. /**
  65. * 新しい ProductView オブジェクトを構築します
  66. * @param $model ProductModel クラスのインスタンス
  67. */
  68. 関数ヘッダー () {

  69. < ;p>}

  70. //! マニピュレータ

  71. /**
  72. * HTML ページの上部を構築します
  73. * @return void
  74. */
  75. function footer () {

  76. }

  77. //! マニピュレーター

  78. /**
  79. * HTML ページの下部を構築します
  80. * @return void
  81. */
  82. function productItem($id=1) {
  83. $this->model->listProduct($id); =$this->model->getProduct() ) {
  84. // データを HTML にバインドする
  85. }
  86. }

  87. //! マニピュレーター

  88. /**
  89. * 単一の商品を表示します
  90. * @return void
  91. */
  92. function productTable($rownum=1) {
  93. $rowsperpage='20';
  94. $this->model->listProducts($rownum,$rowsperpage);
  95. while ( $product=$this->model- >getProduct() ) {
  96. // データを HTML にバインドします
  97. }
  98. }

  99. //! アクセサー

  100. /**
  101. * 製品テーブルを構築します
  102. * @return void
  103. */
  104. function display () {
  105. return $this->output
  106. }
  107. }
  108. ?>
  109. コードをコピー
  110. 最後にコントローラー、ビューをサブクラスとして実装します。 コンストラクター

    /**
    * アプリケーションを制御します
    */
      function ProductController (&$model,$getvars=null) {
    1. $this->header(); getvars['view'] ) {
    2. case "product":
    3. $this->productItem($getvars['id'])
    4. break;
    5. default:
    6. if ( empty ($getvars['rownum']); ) {
    7. $this->productTable();
    8. $this->productTable($getvars['rownum'])
    9. }
    10. break;
    11. }
    12. }
    13. ?> ;
    14. コードをコピー
    15. 注: これが MVC を実装する唯一の方法ではありません。たとえば、コントローラーを使用してモデルを実装し、ビューを統合することもできます。同時。これはパターンを示す 1 つの方法にすぎません。 Index.php ファイルは次のようになります。
    16. require_once('lib/DataAccess.php');
    17. require_once('lib/ProductView.php'); ;
    18. require_once('lib/ProductController.php');

    19. $dao=& new DataAccess ('localhost','user','pass','dbname'); =& new ProductModel($dao);

    20. $productController=& new ProductController($productModel,$_GET);
    21. echo $productController->>

    コントローラーを使用するにはいくつかのトリックがあります。PHP では次のことができます。 $this->{$_GET['メソッド']}($_GET['param']); より標準化されるように、プログラム URL の名前空間形式を次のように定義することをお勧めします。

    1. "index.php?class=ProductView&method=productItem&id=4"
    2. コードをコピーします
    3. 次のようにコントローラーを処理できます。
    $view=new $_GET['class'];
    $view->{$_GET['method']($_GET['id']);
    コードをコピー

    開発速度と適応性の間にトレードオフがある場合など、コントローラーの構築が簡単な作業ではない場合があります。 インスピレーションを得るのに最適な場所は、Apache グループの Java Struts です。この Java Struts のコントローラーは完全に XML ドキュメントによって定義されています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。