現在の位置: ホーム> 最新記事一覧> MVCモードでMySqli_Resultの使用をエレガンにカプセル化します

MVCモードでMySqli_Resultの使用をエレガンにカプセル化します

M66 2025-05-28

特にMVC(Model-View-Controller)アーキテクチャでPHPを使用して開発する場合、データベース操作の管理方法が重要な問題です。 MySQLI拡張機能は、PHPでMySQLデータベースにアクセスする一般的な方法であり、 MySQLI_RESULT関数を使用して、データベースクエリから結果セットを取得します。 MVCアーキテクチャでは、データベースのクエリと結果セットがコントローラーで直接処理される場合、コードを肥大化し、維持が困難で、さらにはスケーリングが困難になる場合があります。したがって、コードの保守性とスケーラビリティを改善するためにmysqli_result関数をエレガントにカプセル化する方法は、開発者が解決する必要がある問題です。

この記事では、MVCモードでMySqli_Resultの使用をエレガントにカプセル化する方法を紹介し、関連するコードの例を示します。

1. MVCアーキテクチャの責任を理解する

MVCアーキテクチャでは、責任の分割は非常に重要です。

  • モデル:データソース(データベースなど)との対話、データクエリのカプセル化、および更新操作を担当します。

  • ビュー:データ表示を担当しますが、通常、データベース操作は含まれません。

  • コントローラー:ユーザー入力を受信し、対応するモデルを呼び出してデータを処理し、結果をビューに渡します。

コードを透明でまとまりに保つために、モデルレイヤーでデータベースと対話するロジックに焦点を合わせる必要があります。コントローラーは、データを取得するためにモデルのメソッドを呼び出すだけです。

2。mysqli_resultをカプセル化する必要性

mysqli_resultオブジェクトは、クエリステートメントを実行することにより返される結果セットです。コードの保守性とスケーラビリティを向上させるには、コントローラー内のmysqli_resultオブジェクトの直接操作を避ける必要があります。理由は次のとおりです。

  1. コードの複製:クエリを処理すると、複数の場所になると、複製コードを引き起こすのは簡単です。

  2. テストが難しいmysqli_resultオブジェクトの直接操作により、ユニットテストが困難になります。

  3. スケーラビリティが低いMySQLI_RESULTを直接操作すると、後でデータベースドライバーを拡張することが困難になります(MySQLからPostgreSQLへの切り替えなど)。

したがって、 mysqli_resultオブジェクトの操作をカプセル化して、異なるシナリオで再利用できる独立したモジュールになり、より簡単に変更および拡張できるようにする必要があります。

3。mysqli_resultの実装のカプセル化

3.1。データベースの抽象クラスを作成します

まず、データベース接続とクエリ操作の処理を担当するデータベース抽象クラスを作成できます。このクラスは、コントローラー内のMySQLI_RESULTオブジェクトの直接操作を避けるために、カプセル化された結果セットを返します。

 <?php

abstract class Database {
    protected $connection;

    public function __construct($host, $username, $password, $dbname) {
        $this->connection = new mysqli($host, $username, $password, $dbname);

        if ($this->connection->connect_error) {
            die("Connection failed: " . $this->connection->connect_error);
        }
    }

    abstract public function query($sql);
}

?>

3.2。特定のデータベースモデルクラスを作成します

次に、データベースクラスから継承する特定のデータベースクラスを作成します。このクラスは、クエリの操作と結果を設定することをカプセル化します。

 <?php

class MySQLDatabase extends Database {

    public function query($sql) {
        $result = $this->connection->query($sql);
        if ($result === false) {
            return false; // クエリが失敗したときに戻ります false
        }
        return new MySQLResult($result); // カプセル化された結果セットオブジェクトを返します
    }
}

?>

3.3。 mysqlresultクラスを作成して、mysqli_resultをカプセル化します

次に、 mysqlresultクラスを作成して、 mysqli_resultオブジェクトをカプセル化します。このクラスは、クエリ結果の操作を簡素化するためのいくつかの便利な方法を提供します。

 <?php

class MySQLResult {
    private $result;

    public function __construct(mysqli_result $result) {
        $this->result = $result;
    }

    public function fetchAll() {
        return $this->result->fetch_all(MYSQLI_ASSOC); // すべてのデータを取得します
    }

    public function fetchRow() {
        return $this->result->fetch_assoc(); // データの行を取得します
    }

    public function numRows() {
        return $this->result->num_rows; // 結果セットで行数を取得します
    }

    public function free() {
        $this->result->free(); // 結果セットをリリースします
    }
}

?>

このクラスでは、すべての行を取得し、単一の行を取得し、結果セット番号を取得し、結果セットをリリースするなど、 mysqli_resultの一般的な操作をカプセル化します。これにより、データベースクエリ操作により簡潔でメンテナンスが簡単になります。

4.コントローラーはデータベースモデルを使用します

コントローラーでは、 mysqli_resultオブジェクトの操作方法を気にせずにモデルのメソッドを呼び出すことでデータを取得できます。

 <?php

class UserController {

    private $db;

    public function __construct() {
        $this->db = new MySQLDatabase('localhost', 'root', '', 'my_database');
    }

    public function getUserList() {
        $sql = "SELECT * FROM users";
        $result = $this->db->query($sql);

        if ($result === false) {
            echo "Query failed.";
            return;
        }

        $users = $result->fetchAll(); // すべてのユーザーデータを取得します
        foreach ($users as $user) {
            echo "User: " . $user['name'] . "<br>";
        }

        $result->free(); // 結果セットをリリースします
    }
}

?>

コントローラーでは、クエリのデータベースモデルのクエリメソッドを呼び出します。返されたmysqlResultオブジェクトは、 fetchall()を介してすべての結果を取得するか、 fetchrow()を使用してシングルラインデータを取得できます。このようにして、コントローラーのコードは非常に簡潔になり、ロジックはデータベース操作から完全に分離されているため、維持と拡張が容易になります。

5。概要

MVCアーキテクチャのmysqli_resultオブジェクトをカプセル化することにより、モデルレイヤーにデータベース操作を濃縮するだけでなく、コードの保守性とスケーラビリティも向上させます。カプセル化されたMySqlResultクラスを使用すると、クエリ結果の処理が簡素化され、コントローラーが基礎となるデータベースの実装を気にせずにビジネスロジックに集中できるようになります。このアプローチは、チームのコラボレーションとその後の機能拡張に大きな利点があります。