ホームページ >バックエンド開発 >PHPチュートリアル >PHPのMVCパターン実装原理の分析(簡単なMVCフレームワーク例)_PHPチュートリアル

PHPのMVCパターン実装原理の分析(簡単なMVCフレームワーク例)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:31:37824ブラウズ

MVC フレームワークがどのようなものであるかについてお話しましょう。

ルーティングメカニズム

インターネットでは、URL を介してサービスを提供するため、URL が異なればサービスも異なります。ユーザーはさまざまなページにアクセスし、さまざまなサービスを受けます。では、私たちのサービスは URL を通じてさまざまなサービスをどのように区別しているのでしょうか。

私たちの Web プログラムは、URL を通じてさまざまなファイルを検索し、さまざまなビジネス ロジック処理を実行する必要があります。私たちのルーティング メカニズムは、URL に基づいて対応するコントローラーとアクションを見つけ、アクションが特定のビジネス ロジック処理を実行することです。

シンプルなコントローラー

コードをコピーします コードは次のとおりです:

//コントローラーを定義します
class UserControler extends Controller{
//アクションメソッドを定義します。publicである必要があることに注意してください
パブリック関数インデックス(){
// ビジネスコードを実行します
}
}

対応する特定のルールは、フレームワークごとに異なる方法でマッピングされます。以下は CodeIgniter フレームワークの URL ルーティングです。URL の状況を分析するためにさまざまな可能性を試みます。

ファイルパス/system/core/URI.php

コードをコピーします コードは次のとおりです:

// コマンドラインから実行されているかどうかを確認します
if (php_sapi_name() == 'cli' または defined('STDIN')){
$this-> ;_set_uri_string($this->_parse_cli_args());
return;
}

// まず、ほとんどの状況に適応する REQUEST_URI を試してください
if ($uri = $this->_detect_uri()){
$this ->_set_uri_string($uri);
Return;
}

// PATH_INFO 変数が存在するかどうか確認しますか? nginx を設定する必要があります
// 注: 一部のサーバーは getenv() に問題があるようですので、2 つの方法でテストします
$path = (isset($_SERVER['PATH_INFO'])) $_SERVER['PATH_INFO'] ? '] : @getenv('PATH_INFO');
if (trim($path, '/') != '' && $path != "/".SELF){
$this->_set_uri_string($path) ;
return;
}

// PATH_INFO がありません。QUERY_STRING を見てください?
$path = (isset($_SERVER['QUERY_STRING'])) $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING' );
if (trim($path, '/') != ''){
$this->_set_uri_string($path);
return;
}

// $_GET から情報を取得してみます
if (is_array($ _GET) && count($_GET) == 1 && Trim(key($_GET), '/') != ''){
$this->_set_uri_string(key($_GET));
return;
}

// 頑張ってルーティングを諦めました
$this->uri_string = '';
return;

上記の試行後の次のステップは、ルーティング メカニズムを使用して正しいコントローラーをロードする方法です。

コントローラーロードメカニズム

Codeigniter フレームワークがどのようにコントローラーにロードされ、アクションを呼び出すかを見てみましょう。

/system/core/Codeigniter.php に次のコードがあります。 Codeigniter は、この前の $_SERVER['PATH_INFO] の値に基づいて値を割り当てます (これはすべて独自の設定に依存します。デフォルトでは、CI には判断のための if 分岐が多数あります)。

コードをコピー コードは次のとおりです:

//250行目あたり
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class() .'.php');

$class = $RTR->fetch_class();
$method = $RTR->fetch_method();

//308行目について
$CI = new $class() ;

//359行目について
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));

以上です。コントローラーとそのメソッドはこれを通じて呼び出されます。次のステップは、独自のビジネス ロジック コードを作成することです。


ビューの表示

ビジネス ロジック コードを記述した後、ページを表示する必要があります。多くの一般的な MVC フレームワークのページ呼び出しは次のように記述されます。

コードをコピーします コードは次のとおりです:
//コントローラー内のアクションメソッド
public function Index(){
//... たくさんのビジネスロジックコード
$data = array('name'=> 'abc', 'age'=>12, .... );
Return $this->render('view/path/file.html',$data);
}

次に、ファイルビューで /path/file.html にコードを書き込みます。
コードをコピーします コードは次のとおりです:

名前:
年齢:

データをビューにレンダリングする方法、これは私が持っていますこのコードについてはいつも興味がありましたが、理解できたので、どのように実装されるかを見てみましょう。
コードをコピーします コードは次のとおりです:
protected function render($template, array $var = array() )
{
extract($var) // 配列内の変数を抽出します
; ob_end_clean (); //最上位の出力バッファー content を閉じます
ob_start (); // 新しいバッファーを開始します
$template .html' // ビューをロードします
$content = ob_get_contents (); // バッファ領域の内容を取得します
ob_end_clean ();
ob_start(); // 新しいバッファを開始し、それを後続のプログラムに使用します。
return $content; // ここでバイトをエコーし​​てコードを終了することもできます。
}

これらの数行のコードはすべて非常に重要であり、PHP の組み込み関数です。次に、それらを詳しく分析してみましょう。

最初の抽出($var)を見てください。この関数は、配列から現​​在のシンボル テーブルに変数をインポートします。先ほど、$data 配列から名前と年齢を抽出しました。これにより、ビューで $name $age を使用できるようになります。詳細については、http://www.php.net/manual/zh/function.extract.php

を参照してください。

2 番目の ob_end_clean() 関数は、前のプログラムによって誤ってエコーされたテキストの一部をクリアするためにトップレベルのバッファを閉じ、次の行のバッファを再度開きます。

3 番目の ob_start() は、ビューのコンテンツをバッファーに入れるために新しいバッファーを開きます。もちろん、バッファには一定のサイズがあり、コンテンツがバッファの設定値を超えると、自動的にサーバーに送信されます。

4 番目の require ファイル (これは最初のパラメーター) は、独自のルールに従ってビュー ファイルを読み込みます。ファイルには php および html コードを含めることができます。この render() 関数で宣言したローカル変数、またはここでアクセスできるグローバル変数は、require ファイルでアクセスできます。

5 番目の $content = ob_get_contents () は非常に重要です。これはバッファーの内容を取り出すものですが、クリアするものではありません。

7 番目の ob_start() は、次のプログラムでバッファを使用するために、バッファを再度開きます。書き込みフレームワークが $content の内容を操作する必要がない場合、 ob_end_flush() はバッファーの内容を直接出力できます。

これはビューを表示する非常に簡単なプロセスです。これを直接使用する場合、ビューをモジュール化するのは不便であるため、一部のフレームワークではこれを直接使用しません。

この機能から、プログラムがプログラム中断保護サイトに似ていることもわかります。ただ、中断保護サイトは最初にデータを保存し、戻ったときにそれを復元します。ここでは、前のバッファを閉じ、新しいバッファを開き、このバッファを閉じ、別のバッファを開くことしかできません。

これまで、単純な PHP MVC フレームワークを見てきました。興味があれば、MVC フレームワークを自分で開発したり、より詳細な HMVC を開発したりできます。

http://www.bkjia.com/PHPjc/762612.html

tru​​ehttp://www.bkjia.com/PHPjc/762612.html技術記事 MVC フレームワークがどのようなものであるかについてお話しましょう。 ルーティングのメカニズム インターネットでは、私たちは URL を介してサービスを提供するため、異なる URL は...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。