ホームページ  >  記事  >  バックエンド開発  >  PHP は単純な MVC を実装します

PHP は単純な MVC を実装します

angryTom
angryTom転載
2019-10-12 16:03:324400ブラウズ

PHP での MVC の使用は、特に一部のオープン ソース フレームワークでますます一般的になりつつあります。ほとんどの状況では MVC で十分ですが、比較的単純な個人ブログなど、適さない状況もあります。記事が数百しかないブログの場合、MVC を使用するのは少し複雑すぎるように感じます。記事が数百しかないブログの場合も同様です。記事で述べたように、MVC はほとんどの状況には適していませんが、Sina などのポータル Web サイトで MVC を使用すると、大量のファイルが読み込まれるため、速度への影響は許容できません。 Maple Bamboo Dream では、MVC の基本原理と簡単な実装を紹介します。次の導入は PHP 開発に適しています。

PHP の MVC (推奨学習: PHP ビデオ チュートリアル )

MVC[1] は、ソフトウェア エンジニアリングにおけるソフトウェア アーキテクチャです。 PHP の観点から見ると、MVC は少し異なります。

モデル(モデル)、プログラムアプリケーションの機能の実現、プログラムロジックの実現。 PHPでのデータ管理とデータ生成を担当します。

View (ビュー)、グラフィカル インターフェイス ロジック。 PHP での出力を担当し、テンプレートと必要なリソース ファイルの呼び出し方法を処理します。

Controller (コントローラー) は、リクエストの転送とリクエストの処理を担当します。 PHP では、呼び出されるビューと使用されるデータがリクエストに基づいて決定されます。

MVC を使用する理由

MVC の主な機能は、コードを階層化して分類することです。

MVC の主な目的は、Web 開発における開発作業と設計作業を分離し、作業を比較的独立させるという問題を解決することです。

このプロセス中に、Web サイトのディレクトリ構造が明確になり、Web サイトの保守と拡張が容易になり、モジュールを再利用できるなど、他の利点も発見しました。

MVC の実装

リクエスト URL

まず、ページをリクエストする際の URL を合意し、次の構造:

localhost/index.php?c=demo&a=index¶m=welcome

より美しい URL 構造を取得したい場合は、URL 構造の最適化を行うことができますが、この URL 構造の最適化はこの記事とはあまり関係がないため、後ほど共有します。

上記のパラメータからわかるように、アクセスされるファイルはindex.phpで、これにはc、a、paramの3つのパラメータも含まれています。

MVC ディレクトリ構造

次に、MVC のディレクトリ構造を次のように計画します。

 /*
 ├─www                       # 网站根目录
 │  ├─controller             # 控制器目录
 │  │  ├─democontroller.php  # demo控制器
 │  ├─model                  # 模型目录
 │  │  ├─model.php           # model模型
 │  ├─view                   # 视图目录
 │  │  ├─index.php           # index视图
 │  ├─index.php              # 入口文件
 */

Controller コントローラー

次のコードをcontroller/democontroller.php ファイルに追加します。

 // controller/democontroller.php
 class DemoController
 {
     public function index()
     {
     echo 'hello world';
     }
 }// End of the class DemoController
 // End of file democontroller.php

このファイルには DemoController クラスが 1 つだけ定義されており、hello world を出力するためのインデックス メソッドのみが含まれています。

次のコードをエントリ ファイルindex.php ファイルに追加します。

 //index.php
 require('controller/democontroller.php');
 $controller = new DemoController();
 $controller->index();
 // End of index.php

ブラウザで上記の同意された URL を使用して、出力された hello world にアクセスして表示します。もちろん、リクエストした URL がそのようなものではなくても、以下に示すように、同じ出力を取得できます。

localhost/index.php?c=abc

URL 内のパラメータは効果がないことがわかりました。

次の URL を使用してアクセスした場合、何も出力されないことが予想されます。

localhost/controller/democontroller.php

この Web サイトにアクセスして正しい結果を取得したい場合は、現在、index.php 経由でのみアクセスできることがわかります。そのため、この Web サイトはエントリー ファイルと呼ばれています。 。これで、パラメータに関係なく同じページにのみアクセスできるようになりました。では、異なる結果を表示するにはどうすればよいでしょうか?あるいは、別のコントローラーを呼び出すのはどうでしょうか?

エントリ ファイルを改善します

以下では、URL 内のパラメーターを使用して、使用するコントローラーを決定します。

  //index.php
 // get runtime controller prefix
 $c_str = $_GET['c'];
 // the full name of controller
 $c_name = $c_str.'controller';
 // the path of controller
 $c_path = 'controller/'.$c_name.'.php';
 // get runtime action
 $method = $_GET['a'];
 // load controller file
 require($c_path);
 // instantiate controller
 $controller = new $c_name;
 // run the controller  method
 $controller->$method();
 // End of index.php

同様に、ブラウザで上記の同意された URL を使用して、出力された hello world にアクセスして表示します。コード内のコメントは、各ステップの目的を説明しています。もちろん、URL パラメーターの c と a の値を変更することで、異なるコントローラーとそのメソッドを呼び出して、異なる結果を出力することができます。

ViewView

以前はコントローラーコントローラーのみを使用し、エントリファイルindex.phpで別のコントローラーを動的に呼び出していました。次に、ビューを結合すると分離が表示されます。

 // view/index.php
 class Index {
     public function display($output) {
         // ob_start();
         echo $output;
     }
 }
 // End of index.php

Index メソッドはビュー ディレクトリの Index.php ファイルで定義されており、渡された変数を出力する役割を担う display() 関数は 1 つだけあります。

以下のコントローラー ファイルを変更します。

 // controller/democontroller.php
 class DemoController
 {
     private $data = 'Hello furzoom!';
     public function index()
     {
     //echo 'hello world';
     require('view/index.php');
     $view = new Index();
     $view->display($data);
     }
 }// End of the class DemoController
 // End of file democontroller.php

データ プライベート変数がコントローラーで定義されています。index() メソッドは直接出力しなくなり、ビュー オブジェクトを使用して出力を処理します。この時点で、上記の合意された URL に従ってアクセスすると、次の出力が表示されます。

Hello furzoom!

さまざまなリクエストに応じてさまざまなビュー クラスを呼び出し、さまざまな形式でデータを表示できます。これによりビューの役割が増加し、デザイナーはビュー専用のページをデザインできるようになります。

モデル

上記は非常に優れているように見えますが、どのような内容が表示されるかはコントローラーで直接指定されます。 URLなのでデータ処理はモデルにお任せください。

 // model/model.php
 class Model {
     private $data = array(
                 'title' => 'Hello furzoom',
                 'welcome' => 'Welcome to furzoom.com',
                 );
     public function getData($key) {
         return $this->data[$key];
     }
 }
 // End of model.php

ビュー ファイル model.php は、要求されたデータを返す getData() メソッドを定義する Model クラスを定義します。

同時に、エントリ ファイルindex.phpを次のように変更します。

  //index.php
 // get runtime controller prefix
 $c_str = $_GET['c'];
 // the full name of controller
 $c_name = $c_str.'controller';
 // the path of controller
 $c_path = 'controller/'.$c_name.'.php';
 // get runtime action
 $method = $_GET['a'];
 // get runtime parameter
 $param = $_GET['param'];
 // load controller file
 require($c_path);
 // instantiate controller
 $controller = new $c_name;
 // run the controller  method
 $controller->$method($param);
 // End of index.php

パラメータ $param を追加し、コントローラのメソッド呼び出しパラメータとして使用します。 。

また、さまざまなパラメーターに基づいてさまざまなデータを取得するには、コントローラー メソッドを変更する必要があります。

 // controller/democontroller.php
 class DemoController
 {
     // private $data = 'Hello furzoom!';
     function index($param)
     {
     // echo 'hello world';
         require('view/index.php');
     require('model/model.php');
     $model = new Model();
     $view = new Index();
     $data = $model->getData($param);
     $view->display($data);
     }
 }// End of the class DemoController
 // End of file democontroller.php

必要なビュー ファイルとモデル ファイルが含まれており、ビュー ファイルとモデル ファイルを生成し、モデル オブジェクトを通じてデータを取得し、ビュー オブジェクトを使用して取得したデータを出力します。

此时,在浏览器中使用上面的约定的URL进行访问,将得到输出如下:

Welcome to furzoom.com

至此PHP的MVC模式已经基本介绍完成了,剩余的工作就是根据需要进行添加扩充了,很简单吧!!

以上がPHP は単純な MVC を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。