PHP MVC フレームワークのチュートリアル

⚡ スマートサマリー

PHP MVCフレームワークの設計では、モデル、ビュー、コントローラーを使用して、アプリケーションのデータとビジネスロジックをプレゼンテーションから分離します。 CodeIgniterはこのパターンを実用的にし、PHP開発者が安全で保守性の高いWebアプリケーションをより迅速に構築できるようにします。

  • 🧩 パターン: MVCは、よりクリーンなコードを実現するために、アプリケーションをモデル(データ)、ビュー(プレゼンテーション)、コントローラー(リクエスト処理)に分割します。
  • 🚀 生産性: フレームワークには、データベースアクセス、検証、入力サニタイズのための事前構築済みライブラリが同梱されているため、チームはより迅速に機能を提供できます。
  • 🛠️ オプション: CodeIgniter、CakePHP、Laminas(旧Zend)は現在も利用可能な選択肢ですが、Kohanaは2017年にサポートが終了しました。
  • 🗄️ 型: In CodeIgniterでは、モデルはCI_Modelを継承し、安全なデータベース操作のためにクエリビルダーのメソッドを使用します。
  • 🎮 コントローラ: コントローラはCI_Controllerを継承し、入力クラスを通してユーザー入力を読み取り、適切なビューをロードします。
  • 📈 影響: シンプルなPHPの投票アプリケーションを移植することで、MVC構造がいかに重複を削減し、長期的なメンテナンスを簡素化するかがわかる。

PHP MVCフレームワーク

PHP MVC フレームワークとは何ですか?

PHP MVC は、アプリケーション データとビジネス ロジック (モデル) をプレゼンテーション (ビュー) から分離するアプリケーション設計パターンです。 MVC はモデル、ビュー、コントローラーの略です。

コントローラーはモデルとビューの間を仲介します。

MVC 設計パターンを車とドライバーとして考えてみましょう。

この車には、運転手(制御装置)が前方の交通状況を監視するために使用するフロントガラス(視界)があり、運転手は前方の状況に応じて加速したり減速したり(モデル)します。

次に、このパターンに基づいて構築されたフレームワークを使用する価値がある理由を見ていきましょう。

PHP MVC フレームワークを使用する理由

PHP MVCフレームワークは、以下の方法で複雑なテクノロジーの扱いを簡素化します。

  • 複雑な実装の詳細をすべて隠す
  • アプリケーションを構築するために使用できる標準的な方法を提供する
  • データベースへの接続やユーザー入力のサニタイズといった基本的な処理が既に部分的に実装されているため、開発者の生産性が向上します。
  • 専門的なコーディング基準の遵守を奨励する

PHP MVC デザインパターン

ここで、MVC デザイン パターンの各コンポーネントについて簡単に説明します。

モデル – この部分はビジネス ロジックとアプリケーション データに関係します。 データ検証の実行、データの処理、保存に使用できます。 データは次のものから取得できます。

  • フラットファイル
  • データベース
  • XML ドキュメント
  • その他の有効なデータ ソース。

コントローラー これは、ユーザーがサーバーに対して要求するリソースを処理する部分です。

例えば、ユーザーが要求すると URL …/index.php?products=listコントローラーは製品モデルをロードして製品データを取得し、その結果をリストビューに出力します。

簡単に言うと、コントローラーは、要求されたリソースに応じてモデルとビューをリンクします。

ビュー この部分は、ユーザーにデータを提示する処理を担当します。通常はHTMLページ形式で行われます。

PHP MVC フレームワークの種類

最適な PHP フレームワークを選択するのは困難です。

MVC の利点を活用するために独自のフレームワークを作成する必要はありません。

MVC フレームワークがどのように機能するかを理解するために、独自の MVC 関連アプリケーション設計の作成のみを試みてください。

MVC フレームワークの動作方法に慣れたら、成熟したテスト済みのフレームワークに進む必要があります。

以下の表は、人気のあるPHPフレームワークとその各フレームワークが提供する機能について簡単に説明したものです。

フレームワーク 詳細説明

Codeイグナイター


Codeイグナイター


https://codeigniter.com/

これは最も人気のある PHP MVC フレームワークの 1 つで、現在は第 4 メジャー バージョン (CodeIgniter 4)は軽量で学習曲線が緩やかです。Webサイトやアプリケーションを迅速に構築するのに役立つ豊富なライブラリセットを備えています。OOPプログラミングの知識が限られているユーザーでも使用できます。 Code点火装置には以下が含まれます。


コハナ


コハナ


http://kohanaframework.org

これは、階層型モデルビューコントローラー(HMVC)を採用した、安全で軽量なフレームワークです。 注意: Kohanaは2017年に正式に開発が終了しました。最後の安定版リリースは3.3.6(2016年7月)でした。コミュニティフォークのKosevenがコードベースを引き継ぎました。Kohanaを使用していた企業には以下のようなものがあります。


CakePHP


CakePHP


www.cakephp.org

Ruby on Railsをモデルにしており、現在も活発にメンテナンスされています(バージョン5.x)。ソフトウェアデザインパターン、設定よりも規約を優先する原則、ActiveRecordなどの概念で知られています。 CakePHP パワードアプリケーションには以下が含まれます。


ゼンド

https://getlaminas.org/


Zend(現Laminas)

これは強力なフレームワークです。

  • 安全、信頼性、高速、スケーラブル
  • ウェブサービスおよびAPIの作成をサポートします。

開発に最適ですping ビジネスアプリケーション。2020年、Zend FrameworkはオープンソースのLaminasプロジェクトに移行しました。Zend/Laminasを搭載したアプリケーションには、以下のようなものがあります。

  • ピムコアCMS、
  • ドットカーネル。

Zendフレームワークを採用している企業には、以下のような企業が含まれます。

  • BBC
  • Cisco
  • Webex
  • Offerings.com

PHP MVCフレームワークとプレーンPHP:主な違い

フレームワークは実際にどのような変化をもたらすのでしょうか?プレーンなPHPでは完全な自由度が得られますが、どのプロジェクトでもルーティング、バリデーション、データベースアクセスをゼロから作り直す必要が生じます。PHP MVCフレームワークはこれらの反復的なタスクを標準化するため、プロジェクトやチーム間でコードの一貫性を保つことができます。

側面 プレーンPHP PHP MVCフレームワーク
Code 組織 単一ファイルにHTML、SQL、ロジックが混在している モデル、ビュー、コントローラーに分けられる
データベースアクセス 各ページに手書きの質問が書かれている 組み込みクエリビルダーまたはパラメータバインディングを備えたORM
セキュリティ 開発者はあらゆる安全対策を覚えておく必要がある 入力フィルタリング、XSS、CSRF対策が含まれています
メンテナンス 変更は予測不能な形でファイル全体に波及する 各レイヤーは個別に変更可能

💡 ヒント: まず、以下の意見調査のような、シンプルなPHPプロジェクトを一つ作成してみてください。コードが混在することによる苦労を経験することで、MVC分離の価値が明らかになります。

世論調査アプリケーションを移植する Codeイグナイター

この中の チュートリアルPHP の投票アプリケーションを作成しました。ここでは、そのコードを移植します。 Codeイグナイター

  • ダウンロード の最新バージョン Code彼らのイグナイター ウェブサイトをご覧ください。
  • Extrac圧縮ファイルの内容を、Webサーバーディレクトリ内の開発ディレクトリにコピーしてください。このレッスンでは、フォルダ名として「ciopinionpoll」を使用します。
  • を参照 URL http://localhost/ciopinionpoll/

CodeIgniter ウェルカムページは、ex の後に表示されます。tracフレームワークを

その Code上記のIgniterウェルカムページで、フレームワークが正しくインストールされていることが確認できます。次に、意見調査アプリケーションを移植します。 CodeIgniter。アプリケーションは、次の3つの主要コンポーネントに分割されていたことを思い出してください。

  • フロントコントローラー – これは、 URL リクエストを送信し、要求されたページを返します。このコードはコントローラーに記述します。
  • モデル – これはデータ要求に応答し、要求されたデータを返すコードです。このコードはモデル内に記述されます。
  • ビュー – これは、データの書式設定と表示を担当するコードです。 このコードはビューに入ります

データベース構成設定

データベース接続を設定するには:

  • ciopinionpollフォルダを参照する
  • Video Cloud Studioで データベース.php ファイルはapplication/configディレクトリにあります。
  • 次のコード行を見つけます

データベース構成設定 CodeIgniterのdatabase.phpファイル

  • ユーザー名をrootに設定します
  • パスワードをローカルホストのrootパスワードに設定してください。
  • データベース名をopinion_pollに設定してください。なお、前回のレッスンで作成したデータベースを使用します。
  • 変更を保存してファイルを閉じます。

モデルの作成

次に、CI_Model を拡張するモデルを作成します。CI_Model は、 CodeIgniterライブラリ。モデルはapplication/modelsに配置されます。 意見投票_モデル.php

<?php
class Opinion_poll_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function total_votes()
    {
        $query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
        return $query->row()->choices_count;
    }

    public function get_results()
    {
        $libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
        $table_rows = '';

        for ($i = 1; $i < 5; $i++)
        {
            $query = $this->db->select('COUNT(choice) as choices_count')
                              ->where('choice', $i)
                              ->get('js_libraries');

            $table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
        }

        return $table_rows;
    }

    public function add_vote($choice)
    {
        $ts = date("Y-m-d H:i:s");
        $data = array('choice' => $choice, 'ts' => $ts);
        $this->db->insert('js_libraries', $data);
    }
}
?>

ここに、

  • 「class Opinion_poll_model extends CI_Model…」は、CI_Model を拡張するモデルです。
  • 「parent::__construct();」はCI_Modelコンストラクタを呼び出します。
  • 「$this->load->database();」 アプリケーションがデータベースと対話できるようにデータベース ライブラリをロードします。
  • 「$this->db->」は CodeIgniterの活動記録。こちらをご確認ください。 アクティブなレコードの詳細については、

コントローラーの作成

それでは、コントローラーを作成しましょう。デフォルトを使用します。 Codeapplication/controllers/welcome.php にある Igniter コントローラーのソースコードを、以下のコードに置き換えてください。

<?php

if (!defined('BASEPATH'))  exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct() {

        parent::__construct();

        $this->load->model('opinion_poll_model');

    }

    public function index() {

        if ($this->input->post('submitbutton') && !$this->input->post('vote')) {

            echo "<script>alert('You did not vote!');</script>";

        }

        if ($this->input->post('vote')) {

            $this->opinion_poll_model->add_vote($this->input->post('vote'));

            $data['total_votes'] = $this->opinion_poll_model->total_votes();

            $data['rows'] = $this->opinion_poll_model->get_results();

            $this->load->view('results', $data);

        } else {

            $this->load->view('opinion_poll_form');

        }

    }

}

/* End of file welcome.php */

/* Location: ./application/controllers/welcome.php */
?>

ここに、

  • 「if (!define('BASEPATH')) exit('直接スクリプト アクセスは許可されません');」 ユーザーがコントローラー クラスに直接アクセスしないようにします。
  • 「class Welcome extends CI_Controller…」コントローラーは CI_Controller クラスを拡張します
  • 「public function __construct()」はCI_Controllerのクラスコンストラクタメソッドを呼び出し、Opinion_poll_modelモデルをロードします。
  • 「public function index()…」は、index.php にマッピングされる関数です。 CodeIgniterの入力クラスを使用して、投票が送信されたかどうかを確認し、送信された投票をデータベースに追加してから結果を表示します。入力クラスのpost配列が空の場合は、投票ページを読み込みます。
  • 「$this->input->post('…')」は Code$_POST グローバル変数の内容を取得する Igniter 入力クラス。
  • 「$this->opinion_poll_model->add_vote($this->input->post('vote'))」は、モデルの add_vote メソッドを呼び出して、データベースに投票を追加します。

私たちの見解を作成する

前の例で、投票用と結果表示用の2つのHTMLページがあったことを思い出してください。ビューを作成するために、同じHTMLコードを最小限の変更で使用します。application/viewsディレクトリに以下のファイルを作成してください。

opinion_poll_form.php
<html>
<head>
    <title>
        JavaScript Libraries - Opinion Poll
    </title>
</head>

<body>
    <h2>JavaScript Libraries - Opinion Poll</h2>
    <p><b>What is your favorite JavaScript Library?</b></p>
    <form method="POST" action="index.php">
        <p>
            <input type="radio" name="vote" value="1" /> JQuery
            <br />
            <input type="radio" name="vote" value="2" /> MooTools
            <br />
            <input type="radio" name="vote" value="3" /> YUI Library
            <br />
            <input type="radio" name="vote" value="4" /> Glow </p>
        <p>
            <input type="submit" name="submitbutton" value="OK" />
        </p>
    </form>
</body>
</html>

次に、結果ページ results.php を作成しましょう。

<html>
    <head>
        <title>JavaScript Libraries - Opinion Poll Results</title>
    </head>
    <body>

        <h2>JavaScript Libraries - Opinion Poll Results</h2>

        <p><b>What is your favorite JavaScript Library?</b></p>

        <p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>

        <p><table><tr><td>

            <?php print($rows); ?>

        </tr></td></table></p>

        <p><a href="#">Return to voting page</a></p>
</body>
</html>

アプリケーションをテストする

アプリケーションのルートディレクトリがciopinionpollであると仮定して、 http://localhost/ciopinionpoll/

世論調査投票フォーム Codeイグナイターアプリケーション

上記の投票ページは、当社のopinion_poll_formビューからのものです。オプションを選択せず​​に「OK」をクリックすると、次の警告メッセージが表示されます。

投票が選択されていない場合に表示される検証アラートメッセージ

お気に入りの図書館に投票したら、「OK」をクリックしてください。次の結果ページが表示されます。

世論調査結果ページには、投票数が表示されます。 Javaスクリプトライブラリ

これは、3つのレイヤーが連携して動作することを示している。コントローラーが投票を受け取り、モデルがそれを保存して集計し、ビューが合計値を表示した。

よくあるご質問

HMVC(階層型モデルビューコントローラー)は、アプリケーションを互いに呼び出し可能な独立したMVCトライアドに編成します。 コハナ HMVCは大規模アプリケーションのモジュール化に役立つため、広く普及した。

Yes. ララベル は現在最も人気のあるPHP MVCフレームワークです。ここで説明したモデル・ビュー・コントローラーの分離方式を採用し、Eloquent ORMやBladeテンプレートなどのツールを追加しています。

はい。 GitHubコパイロット プロンプトに基づいてモデル、コントローラー、ビューを生成できます。ただし、生成されたコードには、エスケープされていない出力やSQLインジェクションなどのセキュリティ上の問題がないか確認する必要があります。

いいえ。AIアシスタントはコード作成のスピードを向上させますが、フレームワークは依然として、アプリケーションの保守性を維持するためのテスト済みの構造、セキュリティのデフォルト設定、および規約を提供します。両者は連携してこそ真価を発揮します。

いいえ。 Codeイグナイター オブジェクト指向プログラミングの経験が少ない開発者にも使いやすい設計です。クラス、メソッド、基本的な継承の知識があれば、モデルパターンとコントローラパターンを理解するのに十分です。