2010-12-11 6 views
2

データベースへのアクセスが必要な第三者のライブラリを構築しています。具体的には、アクセス制御ライブラリです。現在私が直面している最大の問題は、ほとんどのフレームワークやCMSとどのように互換性を持たせることができるかということです。データベースへのアクセスが必要な第三者のPHPライブラリを構築する

開発者が指定したデータベースインスタンスを使用してクエリを発行できます。これには3つの問題があります。

  • データベースインスタンスへのアクセスが必要です。
  • ライブラリは異なるデータベースインスタンス(PDO、MySQLi、mysql-resource、postgresql-resourceなど)を処理できる必要があります。
  • クエリはアプリケーションを経由しないため、キャッシングはありませんアプリがいくつかを使用していると仮定します)。

または、私はSQLを返すメソッドを持つことができますが、それはそれ以上ですか?

答えて

1

「既製品」

アンを気にするAdapter Design Patternスプリングコンポーネントを使用すると、再利用したい魅力的な機能を提供していますが、その「世界観は、」哲学とアーキテクチャと互換性がありません現在開発中のシステムです。

これは、他のクラスで必要なすべてのメソッドでAPIを公開するフレームワーク用のクラスを作成することを意味します。これはあなたがそれをやりとりする唯一のインターフェースです。次に、サポートするデータベースごとにアダプタを作成します。あなたのアダプターはあなたのフレームワークとDALの間の仲介者になります。

例:

interface DB_Interface 
{ 
    public function somethingYourFrameworkUses(); 
} 

class YourDB implements DB_Interface 
{ 
    public function setAdapter(DB_Interface $adapter) 
    { 
     $this->adapter = $adapter; 
    } 
    public function somethingYourFrameworkUses() 
    { 
     $this->adapter->somethingYourFrameworkUses(); 
    } 
} 

上記は、あなたのメインクラスです。残りのフレームワークのコードからのみ、このクラスと対話します。特定のデータベースと対話するために必要な機能は、具体的なアダプタに含まれています。実行時にアダプタをインスタンス化して注入します。

class PDO_Adapter implements DBInterface 
{ 
    public function somethingYourFrameworkUses() 
    { 
     // code to make this function work with PDO 
    } 
} 

class MySQLi_Adapter implements DBInterface 
{ 
    public function somethingYourFrameworkUses() 
    { 
     // code to make this function work with MySQLiAdapter 
    } 
} 

適切に表示されるように追加のアダプターを追加します。

0

Zend_Dbのような既存のデータベース抽象化レイヤの上にビルドすることができます。これによりコードを一度書くだけでどこでも動作します。

関連する問題