2

私はいくつかの「モデル」型クラスの上にデータベース抽象化のレイヤーを構築したい小さなphpアプリを持っています。

私は ezSQL_mysql を使用してデータベースの作業を行っています。

私の質問は、アプリを設計する最良の方法は何ですか? シングルトン パターンを使用して db 接続を共有する必要がありますか? 「モデル」クラスは ezSQL_mysql を拡張する必要がありますか? あるいは、私はここで完全に基地から外れており、何か他のことをする必要があるのか​​もしれません.

私が必要なのはこのようなものです

Controller.php

   $db = new ezSQL_mysql($db_user, $db_passwd, $db_database, $db_host);


   $user = new User();
   $user->update_email($new_email);

   $sale = new Sale();
   $sale->purchase($amount); 

User_model.php

class User {

   /* uses $db connection */
   function update_email(){
     /* do something */
   };
}

Sale_model.php

class Sale {   
   /* uses $db connection*/

   function purchase () {
    /* do something */ 
   }
}
4

3 に答える 3

3

DB接続シングルトンは問題になる可能性があります。幸い、接続の共有には必要ありません。以前に使用したホスト、ユーザー、およびデータベース名を指定すると、すでに開いている接続を返す接続マネージャークラスを作成できます。

abstract class ConnectionManager {
    protected $connections = array();
    function connect($host, $db, $user, $pw) {
        if (! isset($this->connections[$host][$db][$user])) {
            $this->connections[$host][$db][$user] = $this->newConnection($host, $db, $user, $pw));
        }
    }
    abstract protected function newConnection($host, $db, $user, $pw);
}

class EzSQLConnectionManager extends ConnectionManager {
    protected function newConnection($host, $db, $user, $pw) {
        return new ezSQL_mysql($user, $passwd, $database, $host);
    }
}

ここでは、ユーザーの資格情報を安全に保存する方法については説明しません。パスワードは、スクリプト全体にわざわざ広めるべきではありません。このアプローチでは、そうする可能性があります。

于 2011-02-21T22:16:25.170 に答える
2

小さなアプリケーションの場合は、必ずドメイン オブジェクト パターンを使用してください。つまり、すべてのオブジェクトは db エンティティを表します。

次に、マッパー パターンを使用してより複雑なルックアップを db に追加するかどうかを決めることができます。

テスト済みのソリューションを好む場合は、Zend_Db を確認できます。db アダプター、ファクトリなど、必要なものはすべてカバーしています。基本的にはゲートウェイ パターンを実装していますが、mapper のような実装は既にリファレンス マニュアルに示されています。

他のソリューションには、Doctrine や Propel などの ORM が含まれます。

パターンを過度に使用しないでください。小さなアプリの場合は、できるだけ簡単に問題を解決してください。実験としてこれを行っている場合は、Doctrine で遊んでみてください。これらのライブラリは、非常に驚​​くべきものになる場合があります。

于 2011-02-21T22:08:43.727 に答える
0

わかりました...小さなアプリの要件がいつものように大きくなったので、永続的な接続を管理し、データベース層を抽象化するために独自の緩いクラスのセットをロールバックするのではなく、MVC フレームワークを使用することにしました。

だから今、私は CodeIgniter http://www.codeigniter.com/を使っています。

他の回答ありがとうございます。

于 2011-02-23T01:11:05.860 に答える