2012-06-29 22 views
12

DAOパターンを正しく使用しているかどうか、さらに具体的には抽象的なデータベースの永続性がマッパークラスに到達するまでにどのようになるかを調べようとしています。データアクセス抽象化オブジェクトとしてPDOを使用していますが、クエリをあまり抽象化しようとしているのではないかと思うことがあります。PHPデータアクセスオブジェクト

私はどのように選択クエリを抽象化しているのかを説明しましたが、すべてのCRUD操作のメソッドを記述しました。

class DaoPDO { 

    function __construct() { 

     // connection settings 
     $this->db_host = ''; 
     $this->db_user = ''; 
     $this->db_pass = ''; 
     $this->db_name = ''; 


    } 

    function __destruct() { 

     // close connections when the object is destroyed 
     $this->dbh = null; 

    } 


    function db_connect() { 

     try { 

      /** 
      * connects to the database - 
      * the last line makes a persistent connection, which 
      * caches the connection instead of closing it 
      */ 
      $dbh = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", 
          $this->db_user, $this->db_pass, 
          array(PDO::ATTR_PERSISTENT => true)); 


      return $dbh; 

     } catch (PDOException $e) { 

      // eventually write this to a file 
      print "Error!: " . $e->getMessage() . "<br/>"; 
      die(); 

     } 


    } // end db_connect()' 



    function select($table, array $columns, array $where = array(1=>1), $select_multiple = false) { 

     // connect to db 
     $dbh = $this->db_connect(); 

     $where_columns = array(); 
     $where_values = array(); 

     foreach($where as $col => $val) { 

      $col = "$col = ?"; 

      array_push($where_columns, $col); 
      array_push($where_values, $val); 

     } 


     // comma separated list 
     $columns = implode(",", $columns); 

     // does not currently support 'OR' arguments 
     $where_columns = implode(' AND ', $where_columns); 



     $stmt = $dbh->prepare("SELECT $columns 
           FROM $table 
           WHERE $where_columns"); 


     $stmt->execute($where_values); 

     if (!$select_multiple) { 

      $result = $stmt->fetch(PDO::FETCH_OBJ); 
      return $result; 

     } else { 

      $results = array(); 

      while ($row = $stmt->fetch(PDO::FETCH_OBJ)) { 

       array_push($results, $row); 

      } 

      return $results; 

     } 



    } // end select() 


} // end class 

だから、私の二つの質問:

  1. これはDAOの正しい使用である、または私はそれが目的だ誤解のですか?

  2. この程度のクエリプロセスを抽象化しているのは不必要なことですか、まれにしかありませんか?私は物事があまりにも簡単にしようとしているように時々私はそれは必ずしも必要ではないが、それは確かに一般的な方法です

答えて

20

をやっているよりもそれが見え、多くのライブラリがあります。 。 DAOにはさまざまな形がありますが、ビジネスロジックと永続化メカニズムを分離することが目標です。

Business Logic 
     | 
     v 
Data Access Object 
     | 
     v 
Persistence Layer 

db_connectselectとDAOはあまりにも密接に永続化層をモデルにしています。一般的なDAOの最も単純な形式は、永続化メカニズムの内部を公開することなくオブジェクトレベルで基本的なCRUD操作を提供することです。

interface UserDao 
{ 
    /** 
    * Store the new user and assign a unique auto-generated ID. 
    */ 
    function create($user); 

    /** 
    * Return the user with the given auto-generated ID. 
    */ 
    function findById($id); 

    /** 
    * Return the user with the given login ID. 
    */ 
    function findByLogin($login); 

    /** 
    * Update the user's fields. 
    */ 
    function update($user); 

    /** 
    * Delete the user from the database. 
    */ 
    function delete($user); 
} 

ビジネスオブジェクトが基本となるPDOモデルオブジェクトの場合は、DAOから戻すことができます。選択した基本的な永続性のメカニズムによっては、これは理想的ではないことに注意してください。私はPDOで作業していませんが、ビジネスロジックをPDO APIに結びつけることなく、標準のPHPオブジェクトを生成する他のORMツールに似ていると想定しています。だからあなたはおそらくここで大丈夫です。

例えば、mysqliライブラリに直接アクセスして永続性を実装する場合は、結果セットとの間でデータをコピーすることをお勧めします。これはDAOがビジネスロジックからそれを守る仕事です。

DAO用のインターフェイスを使用することで、PDO、Doctrine、生のSQLなど、さまざまな永続性フレームワークに対して実装できるようになりました。プロジェクトの途中でメソッドを切り替えることはまずありませんが、インターフェイスを使用するコストは他のメリットと比べて無視できます。ユニットテストでモックを使用しています。

+0

したがって、ドメインモデルの各ドメインオブジェクトは、CRUD操作のために関連するDaoオブジェクトを持つことができますか? – jerry

+0

@saddog - 各ルートレベルオブジェクト、はい。例えば、 'Order'とその' LineItem'子のリストは、おそらく 'OrderDao'を通して一緒に格納されます。残念ながら、ドメイン・モデル・オブジェクトを永続化する方法からビジネス・ロジックを完全に分離することはめったにありません。 –

+0

さて、実際にはもう1つ質問があります。それから私は受け取り、あなたに恩恵を与えます。 LineItemの子供について言及すると、私は自分のアプリケーションでこれらを正しく処理していることを確認したいと思います。これらの子は、db(LineItemテーブル)のテーブルにマップされ、DaoによってOrderドメインオブジェクトに統合されるだけですか?つまり、DaoUser内のcreateObjectメソッドは、これらの2つのオブジェクトを一緒にするものでしょうか? – jerry

0
  1. ...感じます。あなたはPDOの上に永続化抽象化レイヤ(永続化層そのものである)ではなくdata access objectを構築している以上のような抽象的なwaaaaayさらにあなたは:)
関連する問題