ホームページ > バックエンド開発 > PHPチュートリアル > 独自の PHP MVC フレームワークを開発する

独自の PHP MVC フレームワークを開発する

WBOY
リリース: 2016-06-23 13:12:40
オリジナル
994 人が閲覧しました

このチュートリアルは、誰もが MVC モードを使用した PHP アプリケーション開発の基本概念を習得するのに役立ちます。このチュートリアルは 3 つの部分に分かれており、これは最初の部分です。

現在、誰もが使用できる人気のフレームワークが数多く市場に出ていますが、mvc モデルを使用すると、アプリケーションの開発に費やす時間を大幅に削減でき、プロジェクトのソース コードをより適切に整理できます。その中には、他のプロジェクトでも使用できるモジュールもあります。ここで、簡単な MVC フレームワークの書き方を教えたいと思います。このプロジェクトは非常にシンプルで軽量であるため、ベストプラクティスではない可能性があり、安全でもありません。実際のアプリケーションではまだ改善する必要があります。

使用テクノロジー: php、オブジェクト指向開発手法。

開始

まず、Web サイトのルート ディレクトリに 3 つのフォルダーを作成します

  • models
  • views
  • controllers
  • 次に、ルート ディレクトリに新しいファイルを作成します:

  • index.php
  • これで、プロジェクト構造は次のようになります

    § Web サイトのルート ディレクトリ

    §index.php

    § models/

    § views/

    §controllers/


    index.php は、 Web アプリケーション全体、すべてのユーザー リクエストがそれを通過します。ユーザーリクエストをコントローラーフォルダーに保存されている対応するコントローラーにディスパッチするためのコードを作成します。その後、次のメソッドを使用してページジャンプを実行できます:

  • http://yourdomainname.com/index.php?page1
  • http://yourdomainname.com/index.php?
  • http://yourdomain.com/index.php?page3
  • フロントエンドコントローラーのindex.phpを設定します

    まず、アプリケーション全体でアクセスできるように、WebサイトのルートディレクトリとWebサイトのドメイン名をindex.phpで定義します。

    1. //アプリケーションのルートディレクトリはindex.phpの親ディレクトリです
    2. define("SERVER_ROOT", dirname(__FILE__)); //あなたのドメイン名 .comm は、サーバーのドメイン名です
    3. define('SITE_ROOT' , 'http://あなたのドメイン名.com');
    Web サイトのルート ディレクトリを定義した後、php ファイルで他のディレクトリにある php ファイルを参照すると便利です。index.php がエントリ ファイルであり、そこで定義された変数にアプリケーション全体でアクセスできるためです。

    ルーター router.php を設定します (ユーザーリクエストを対応するコントローラーに転送します)

    「router.php」という名前で新しいファイルをコントローラーディレクトリに作成します。このファイルは、すべてのページリクエストを処理するために使用されます。家のルーターが、家のすべてのコンピューターにインターネットをルーティングする役割を果たしていると想像してください。 router.php ファイルは、受信ページリクエストをindex.phpに受け取り、そのリクエストを別のコントローラにディスパッチします。

    route.php のコード:

    1. //すべてのリクエストを取得します
    2. $request = $_SERVER['QUERY_STRING'];
    3. このコードはリクエストを取得しますアプリケーションに渡されるパラメータ。 QUERY_STRING は、「?」以降のすべての文字列です。


    http://ドメイン名.com/index.php?page1

    上記のアドレスは、コード内で「page1&action=login」を取得します。page1 を次のパラメータから分離するには、次を使用する必要があります。引き続き次のコードを php に追加します。

    1. //$request 変数を解析して、ユーザーによって要求されたページ (page1) と、リクエスト http://your domain name.com/index.php?page1&article などの他の GET 変数 (および分離された変数) を取得します。 =buildawebsite は array("page1", "article=buildawebsite") として解析されます
    2. $parsed =explode('&' , $request);
    3. //上記の page1 など、ユーザーによって要求されたページ、は $parsed 最初の変数、シフト後の配列は array("article=buildawebsite")
    4. $page = array_shift($parsed);
    5. //残りは GET 変数で、解析します
    6. $getVars = array();
    7. foreach ($parsed as $argument)
    8. {
    9. // 左側に変数、右側に値を指定して文字列を区切ります
    10. list($variable, $value) = Split( '=' , $argument);
    11. $getVars[$variable] = $value;
    12. //これはテストステートメントです、後で削除されます
    13. print "リクエストしたページは '$page' ";
    14. print '
      ';
    15. $vars = print_r($getVars, TRUE);
    16. print "次の GET 変数がページに渡されました:
      ".$vars. "
      "; SERVER_ROOT ", dirname(__FILE__));
    17. define('SITE_ROOT' , 'http://yourdomain.com');
    18. * ドキュメントパスを定義します
    */ require_once(SERVER_ROOT . '/controllers/' .'router.php');

    ?>

    1. 問題がなければ、ブラウザを開いて次のように入力します。 ://yourdomain.com/index.php?news&article=howtobuildaframework
    2. 次の出力が表示されます
    3. リクエストしたページは 'news' です
    4. 次の GET 変数がページに渡されました:
    5. 配列
    6. (
    7. ) )


    上記の出力がない場合は、サーバー構成が正しいかどうかを確認し、コードにエラーがないかどうかを確認してください。

  • 次に、Web サイトにページを追加して、router.php が上記の情報を直接出力する代わりにページを生成できるようにしましょう。

    コントローラー (コントローラー) を作成します

    1. コントローラーフォルダーに「news.php」という名前の新しいファイルを作成し、次のクラスを定義します:
      1. /**
      2. * このファイルは記事のクエリを処理し、記事を提供します
      3. */
      4. class News_Controller
      5. {
      6. /**
      7. * $template 変数は、.php 接尾辞を除いた、このコントローラーに関連する「ビュー (ビュー)」のファイル名を保存します*/
      8. public $template = 'ニュース' ;
      9. / **
      10. */
      11. public function main(array $getVars)
      12. { このコントローラーに '
      13. "
        ".$vars." /pre>" 
      14. );次に、route.php のコードを変更しましょう:
        1. /**
        2. * このファイルは、すべての受信パラメーターを対応するコントローラーにディスパッチします
        3. */
        4. //リクエストパラメータを取得する
        5. $request = $_SERVER['QUERY_STRING'];
        6. //リクエストを解析するページその他の GET 変数
        7. $parsed =explode('&' , $request);
        8. //ページは最初の要素です
        9. $page = array_shift($parsed); GET 変数である場合、それらも解析します
        10. $getVars = array();
        11. foreach ($parsed as $argument)
        12. {
        13. // GET 変数を '=' 記号に沿って分割し、変数、値を分離します
        14. list ($variable, $value) = split('=', $argument);
        15. $getVars[$variable] = $value;
        16. //コントローラーファイルパスを構成します
        17. $target = SERVER_ROOT . '/controllers/' . '.php'
        18. //ターゲットファイルを導入します
        19. if (file_exists($target))
        20. include_once($target);
        21. / / 命名規則に従ってページ変数を変更します ($page="news" など、最初の文字を大文字にするのが規則です。コントローラーを使用する場合は、"_Controller" $class = ucfirst($page) .'_Controller';
        22. //対応するクラスを初期化します
        23. if (class_exists($class))
        24. {
        25. $コントローラー= new $ class;
        26. 「 !');
        27. }
        28. //コントローラーが初期化されたら、そのデフォルト関数 main() を呼び出します
        29. // それに get 変数を渡します
        30. $controller ->main($getVars);?>
        31. http://yourdomain.com/index.php?news&article=howtobuildaframework に再度アクセスすると、News_Controller から出力された情報が表示されます。現在、エラーを処理するために die() を使用していることに注意してください。他のより適切なエラー処理で制御できますが、現時点では http://yourdomain.com/index.php などの他のページにアクセスしてみてください。 ?books の場合、「ページが存在しません!」というエラーが表示されます。 News_Controller を完成させるモデルを作成します。読者が読むためのニュース スニペットがいくつかあると仮定すると、News_Controller コントローラーがモデルを呼び出して、関連するニュース スニペットがデータベースに保存されているかファイルに保存されているかに関係なく、それらを取得する必要があります。次のコードを使用して、モデル フォルダー「news.php」に新しいファイルを作成します:
          1. /**
          2. * ニュースモデルは、ニュースコントローラーの複雑なバックグラウンド操作を実行します
          3. */
          4. class News_Model
          5. {
          6. public function __construct()
          7. {
          8. Print '私はニュースモデルです';
          9. ここで、ニュース コントローラーにいくつかの変更を加える必要があります。コントローラーで news.php を開き、News_Controller クラスの main 関数のコードを次のように変更します。 "News_Model" 画面に表示される情報を確認すると、次のようになります。

          public function main(array $getVars)

          {

          $newsModel = new News_Model

          }

          1. 今すぐページを更新すると、次のように表示されます。 :
          2. 致命的なエラー: クラス 'News_Model' が /var/www/mvc/controllers/news.php の xx 行目に見つかりません

          ちょっと待って、これは私たちが望んでいる結果ではありません。存在しないクラスをロードしようとしています。その理由は、/models/news.php ファイルを導入していないためです。この問題を解決するには、router.php をもう一度見て、その先頭にコードを追加しましょう:

          1. //クラスが初期化されると、関連ファイルが自動的に導入されます
          function __autoload($className)

          {

          //ファイル名を解析し、ファイルのストレージ パスを取得します。例: News_Model は、models フォルダーに保存されている news.php を表します (これは作成者の命名規則です)

          1. list($filename, $suffix) = Split(' _' , $className); // 構築ファイルのパス
          2. $file = SERVER_ROOT . '.php';ファイル
          3. if (file_exists($file))
          4. { ' を含むクラス '$className' が見つかりません。");
          5. }
          6. }
          7. この関数は、PHP の組み込みオートロード関数をオーバーロードします。この「魔法のメソッド」を使用すると、存在しないクラスを初期化しようとしたときに PHP によって実行されるアクションをインターセプトできます。 __autoload 関数を使用すると、このクラスを含むファイルを検索する場所を PHP に指示できます。この記事のクラス名とファイル名の命名規則に従っていると仮定すると、クラスを初期化するたびに、このクラスを含むファイルを手動でインクルードする必要はありません。
          8. route.php を保存し、ブラウザを再度更新すると、以下が表示されます:
          9. 私はニュース モデルです
          10. 記事を提供するために、ニュース モデル クラスでいくつかの関数を定義しましょう。ここでは、単純に配列を定義し、いくつかの記事を保存し、コントローラーがタイトルに基づいてそこから記事を取得できるようにする関数を提供します。 models/news.php を変更します:
            1. /**
            2. * ニュース モデルは、ニュース コントローラーの複雑なバックグラウンド操作を実行します
            3. *
            4. */
            5. class News_Model
            6. {
            7. /**
            8. * 記事の配列 キーは記事のタイトルで、値は対応する
            9. * 記事です。
            10. */
            11. private $articles = array
            12. (
            13. //文章1
            14. '新しい' => 配列
            15. (
            16. 'タイトル' => '新しいウェブサイト',
            17. 'コンテンツ' =& gt; 「サイトへようこそ! ここに来ていただき嬉しいです。」
            18. )
            19. ,
            20. //2
            21. 'mvc' => 配列
            22. (
            23. 'タイトル' => 「PHP MVC フレームワークは素晴らしいです!」
            24. '内容' =>とても簡単です。ぜひご利用ください。'
            25. )
            26. //3
            27. 'test'
            28. (
            29. 'タイトル' => 'テスト' ,
            30. '内容' => 「これは単なるテスト記事です。」
            31. )
            32. );  
            33. public function __construct()
            34. {
            35. }
            36. /**题 标*タイトルに従って記事を取得します
            37. @@param String $ ArticLleName
            38. @@@@*/
            39. public 関数 get_article( $articleName)
            40. {
            41. //从数组中获取文章
            42. $article = $this->articles[$articleName];  
            43. $article に戻る;  
            44. }
            45. }?>  
            46. 次に、controllers/news.php の main 関数を変更します。

              1. public function main(array $getVars)
              2. {
              3. $newsModel = new News_Model
              4. //記事を取得
              5. $article = $ NewsModel-> get_article( 'test');
              6. 次の URL にアクセスすると:
              7. § http://yourdomain.com/mvc/index.php?news&article=test
              次の出力が表示されます:

              Array ([title ] = > テスト [内容] => これは単なるテスト記事です )

              ビュー (VIEW

              ) の作成

              1. これで、ビューが 1 つだけ不足しています。ビューはプレゼンテーション層であり、ユーザーと最も頻繁に接触するアプリケーションの部分です。ビューはビジネス ロジックとは別のユーザー インターフェイスを提供することを前に述べましたが、これを行う方法は数多くあります。テンプレート エンジン Smarty などを使用できます。独自のテンプレート エンジンを作成することもできますが、それは確かにかなり難しい作業になります。最後に、ネイティブ PHP ビューを使用できるようになります。
              今のところ、php view で十分です。これは、以前の PHP コードと HTML コードの混合プログラミングとまったく同じですが、1 つの違いは、ビジネス ロジックがビューから分離されていることです。次のコードを見てください:

              t;私たちのウェブサイトへようこそ! ;

              < ;/p>

              記号。このようにして、コンテンツを HTML に直接出力できます。 views フォルダーに新しいファイル「news.php」を作成し、その中に上記のコードをコピーします。これでビュー ファイルが完成しましたが、ビューを操作する方法が必要です。 models フォルダーに新しいファイル「view.php」を作成し、次のコードを追加します:

                1. /**
                2. * MVC フレームワークで、ビューの関数を処理します
                3. */
                4. class View_Model
                5. {
                6. /**
                7. * ビュー テンプレートに割り当てられた変数を保存します
                8. */
                9. private $data = array();  
                10. /**
                11. */
                12. private $render = FALSE;  
                13. /**
                14. * ビューテンプレートをロードします
                15. */
                16. public function __construct($template)
                17. {
                18. //构成完全文件路径
                19. $file = SERVER_ROOT 。 '/views/' 。 strto lower($template) 。 '.php';  
                20. if (file_exists($file))
                21. {
                22. /**
                23. to to ホルダーのホルダー
                24. through using using using using using using using using using using using out through out through out using using my's my' mys my' my's my' my' my' my's call my's my'stil'スーパーファミコン*/
                25. $this-& gt;render = $file;  
                26. }
                27. }
                28. /**从 コントローラから与えられた変数を受*受け入れて、Data配列に保存します
                29. *
                30. *@param $ variable
                31. *@Param $ value
                32. */
                33. public function assign($variable , $value)
                34. {
                35. $this->data[$variable] = $value;  
                36. }
                37. public function __destruct()
                38. {
                39. // クラス内のデータ数集合はこの関数の局部变量、方便模板中使用
                40. $data = $this->データ;  

                41. //渲染映图
                42. include($this->render);  
                43. }
                44. }
                45. 在、最後の件が行われる事は、News_Controller に追加されたビュー図です。

                  1. /*
                  2. *このファイルは記事のクエリを処理し、ニュース記事を生成します*
                  3. */
                  4. class News_Controller{
                  5. /**
                  6. * $template 変数は、.php 接尾辞を除いて、このコントローラーに関連する「ビュー」のファイル名を保存します
                  7. *
                  8. */
                  9. public $template = 'ニュース';
                  10. /**
                  11. */
                  12. public function main(array $getVars) {
                  13. $newsModel = new
                  14. //記事を取得しますget_article ($ getvars ['article'; ]);
                  15. // ビューを作成し、コントローラーの Template 変数を渡す
                  16. $ view = new view_model ($ this- & gt; template) 記事データがビュー テンプレートに割り当てられます
                  17. $view->assign( 'title' , $article['title']);
    関連ラベル:
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート