目次
フロントエンドコントローラーのindex.phpを設定します
route.php のコード:
ホームページ バックエンド開発 PHPチュートリアル 独自の PHP MVC フレームワークを開発する

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

Jun 23, 2016 pm 01:12 PM

このチュートリアルは、誰もが 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']);
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

    JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

    セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

    セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

    確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

    PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

    phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

    phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

    システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

    システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

    PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

    静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

    PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

    PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

    See all articles