ホームページ  >  記事  >  バックエンド開発  >  PHPで簡単なMVCを開発する

PHPで簡単なMVCを開発する

WBOY
WBOYオリジナル
2016-07-25 09:11:44861ブラウズ

この記事は、php を使用して簡単な mvc を開発する方法を例を通じて紹介します。この記事は、mvc を初めて使用する友人に適しています。 MVC は実際には、Model、Controller、View の 3 つの単語の略語です。 Model の主なタスクは、必要な方法でデータベースまたは他のファイル システムからデータを読み取ることです。 View は主にページを担当し、データを HTML 形式でユーザーに表示します。 コントローラーは主にビジネスロジックを担当し、ユーザーのリクエストに応じてリクエストを割り当てます。たとえば、ログインインターフェイスを表示するには、コントローラーの userController の loginAction メソッドを呼び出して表示する必要があります。

この記事では、PHP を使用して簡単な MVC 構造システムを作成する方法を紹介します。

まず、MVC システム全体への唯一の入り口として、単一のエントリ ポイントであるブートストラップ ファイルindex.php を作成します。 単一エントリポイントとは何ですか?いわゆる単一エントリ ポイントとは、アプリケーション全体の入口が 1 つだけあり、すべての実装がこの入口を通じて転送されることを意味します。なぜ単一のエントリポイントが必要なのでしょうか? 単一のエントリポイントを持つことには、いくつかの利点があります。 まず、システムによってグローバルに処理される一部の変数、クラス、メソッドをここで処理できます。 たとえば、データの予備フィルタリングを実行する必要があり、セッション処理をシミュレートする必要があり、いくつかのグローバル変数を定義する必要があり、さらにいくつかのオブジェクトや変数をレジスタに登録する必要もあります。 次に、プログラムの構造がより明確になります。

  1. include("core/ini.php");
  2. initializer::initialize();
  3. $router =loader::load("router");
  4. dispatcher::dispatch( $router);
コードをコピー

このファイルには 4 つの文しかありません。今から文ごとに分析してみましょう。 include("core/ini.php");

core/ini.phpを見てみましょう

  1. set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");
  2. //set_include_path — include_path 構成オプションを設定します
  3. function __autoload($object){
  4. require_once("{$ object}.php");
  5. }
コードをコピー

このファイルは最初に include_path を設定します。つまり、インクルードされたファイルを見つけたい場合は、このディレクトリ内を検索するようにシステムに指示します。実際、__autoload() メソッドを定義しています。このメソッドは、関数をインスタンス化するときに、ファイルが存在しない場合に自動的にロードされます。公式の説明は次のとおりです。 オブジェクト指向アプリケーションを作成する多くの開発者は、クラス定義ごとに 1 つの PHP ソース ファイルを作成します。最大の煩わしさの 1 つは、各スクリプトの先頭に (クラスごとに 1 つ) 必要なインクルードの長いリストを記述しなければならないことです。

PHP 5 では、これは必要なくなりました。まだ定義されていないクラス/インターフェイスを使用しようとしている場合に自動的に呼び出される __autoload 関数を定義できます。この関数を呼び出すことで、スクリプト エンジンにPHP がエラーで失敗する前にクラスをロードする最後のチャンスです。

次の文を見てみましょう

initializer::initialize(); これは、initializer クラスの静的関数である initialize を呼び出すことを意味します。ini.php で include_path を設定し、__autoload を定義したため、プログラムは core/main ディレクトリで initializer.php を自動的に検索します。 Initializer.php ファイルは次のとおりです。

  1. クラス初期化子
  2. {
  3. パブリック静的関数initialize() {
  4. set_include_path(get_include_path().PATH_SEPARATOR . "core/main");
  5. set_include_path(get_include_path().PATH_SEPARATOR . "core /main/cache");
  6. set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");
  7. set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");
  8. set_include_path(get_include_path().PATH_SEPARATOR . "アプリ/controllers");
  9. set_include_path(get_include_path().PATH_SEPARATOR."app/models");
  10. set_include_path(get_include_path().PATH_SEPARATOR."app/views");
  11. //include_once("core/config/config.php ");
  12. }
  13. }
  14. ?>
コードをコピー

この関数は非常に単純で、静的関数、初期化関数を定義するだけです。このように、今後ファイルまたは __autoload がインクルードされる場合、それらはこれらのディレクトリで検索されます。

OK、続けて 3 番目の文を見てみましょう $router =loader::load("ルーター");

この文も非常にシンプルで、ローダー関数をロードする静的関数loadです。 次に、loader.phpを見てみましょう。

  1. クラスローダー
  2. {
  3. プライベート静的$loaded = array();
  4. パブリック静的関数load($object){
  5. $valid = array( "ライブラリ",
  6. "ビュー",
  7. "モデル",
  8. "ヘルパー",
  9. "ルーター",
  10. "config",
  11. "フック",
  12. "キャッシュ",
  13. "db");
  14. if (!in_array($object,$valid)){
  15. throw new Exception("ロードする有効なオブジェクト '{$object}' ではありません");
  16. }
  17. if (empty(self::$loaded[$object])){
  18. self::$loaded[$object] = new $object();
  19. }
  20. return self::$loaded[$object];
  21. }
  22. }
コードをコピー

将来この MVC システムを強化する可能性があるため、このファイルはオブジェクトをロードするためのものです, モデル、ヘルパー、構成などのコンポーネントが存在します。ロードされたコンポーネントが有効な範囲内にない場合は、例外がスローされます。その場合、実際に、ここではシングルトン設計パターンが使用されます。つまり、このオブジェクトは実際にはインスタンス化されたオブジェクトのみになります。インスタンス化されていない場合は、インスタンス化されません。

さて、ここでロードしたいのはルーターコンポーネントなので、router.php ファイルを見てみましょう。このファイルの機能は URL のマッピングと URL の解析です。 ルーター.php

  1. クラスルーター
  2. {
  3. private $route;
  4. private $controller;
  5. private $action;
  6. private $params;
  7. public function __construct()
  8. {
  9. $path = array_keys($ _GET);
  10. if (!isset($path[0])){
  11. if (!empty($default_controller))
  12. $path[0] = $default_controller;
  13. else
  14. $path[0] = "インデックス";
  15. }
  16. $route= $path[0];
  17. $this->route = $route;
  18. $routeParts = split( "/",$route);
  19. $this->controller=$routeParts[0] ;
  20. $this->action=isset($routeParts[1])? $routeParts[1]:"base";
  21. array_shift($routeParts);
  22. array_shift($routeParts);
  23. $this->params= $routeParts;
  24. }
  25. public function getAction() {
  26. if (empty($this->action)) $this->action="main";
  27. return $this->action;
  28. }
  29. public function getController() {
  30. return $this->controller;
  31. }
  32. public function getParams() {
  33. return $this->params;
  34. }
  35. }
コードをコピー

$_GET (ユーザーのリクエストの URL) を取得し、URL からコントローラー、アクション、およびパラメーターを解析します。 たとえば、当社のアドレスは http://www.tinoweb.cn/user/profile/id/3 です。 したがって、上記のアドレスから、コントローラーがユーザー、アクションがプロファイル、パラメーターが ID と 3 であることがわかります

OK、最後の文を見てみましょう。 ディスパッチャー::ディスパッチ($router);

この文の意味は非常に明確です。URL 解析の結果を取得し、ディスパッチャーを使用してコントローラーとユーザーに応答するアクションを配布します。 さて、dispatcher.php ファイルを見てみましょう

  1. クラスディスパッチャ

  2. {
  3. public static functiondispatch($router)
  4. {
  5. global $app;
  6. ob_start();
  7. $start = microtime(true);
  8. $controller = $router->getController();
  9. $action = $router->getAction();
  10. $params = $router->getParams();
  11. $controllerfile = "app/controllers/{$controller }.php";
  12. if (file_exists($controllerfile)){
  13. require_once($controllerfile);
  14. $app = new $controller();
  15. $app->setParams($params);
  16. $app-> $action();
  17. if (isset($start)) echo "

  18. ディスパッチにかかる合計時間は : ".(microtime(true)-$start)." 秒です。";

  19. $output = ob_get_clean();
  20. echo $output;
  21. }else{
  22. throw new Exception("コントローラーが見つかりません");
  23. }
  24. }
  25. }

コードをコピー

このクラスは $router を取得し、ユーザーのリクエストに応答するファイル内のコントローラーとアクションを検索します。 これで、単純な MVC 構造が完成しました。もちろん、これは View と Model を含まないため、完全な MVC ではありません。時間があるときにさらに追加します。 上記のシステムをテストするためにコントローラー ファイルを作成してみましょう。 app/controllers/ の下に user.php ファイルを作成します。 //ユーザー.php

  1. class user
  2. {
  3. function Base()
  4. {
  5. }
  6. public function login()
  7. {
  8. echo 'ログイン HTML ページ';
  9. }
  10. public function register()
  11. {
  12. echo 'register html page';
  13. }
  14. public function setParams($params){
  15. var_dump($params);
  16. }
  17. }
コードをコピーします

次に、ブラウザー localhost/index.php?user/register または http://localhost/index.php?user/login をテストします。



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