2009-11-14 27 views
6

ZendApplicationの規則をよく熟知していると仮定すると、アプリケーション開発者がアクセスするデータベースハンドラを設定する場所はどこですか?データベースハンドラを使用してZendアプリケーションを提供する「正しい」方法

私は​​アダプターを設定する方法を知っています。私が知りたいのは、Zend Frameworkのコンテキストでは、開発者はDBハンドラをどのようにインスタンス化して、1回のリクエストで複数のインスタンス化を心配する必要がなく、毎回資格情報を提供するなどです。

たとえば、開発者がCode Igniterを使用していて、任意のクエリを実行する必要がある場合、コントローラにはデータベースハンドラがあります。

$this->db->query(.... 

この規約のZendに相当するものは何ですか?明確にするために、私はZend Frameworkが提供するツールを使用してこれを達成する方法を6つ考えています。私が探しているのは、Zend Frameworkが一般的なケースでこれをやりたがっていることです。

答えて

18

アイデアは、あなたのブートストラップは、設定ファイルを読み込み、あなたが作成するデータベース・アダプタを記述するために設定項目を宣言することである:

[bootstrap] 
resources.db.adapter = Pdo_Mysql 
resources.db.params.dbname = "mydatabase" 
resources.db.params.username = "webuser" 
resources.db.params.password = "XXXX" 
resources.db.isDefaultTableAdapter = true 

あなたが右の規則次のconfigキーを使用する場合、これは自動的に信号ブートストラップ基本クラスはZend_Application_Resource_Dbオブジェクトを作成して初期化し、bootstrap resource registryに格納します。

後でコントローラで、リソースレジストリにアクセスできます。 注:私はもう少しテストした後、このコードを編集しました。

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $bootstrap = $this->getInvokeArg("bootstrap"); 
     if ($bootstrap->hasPluginResource("db")) { 
      $dbResource = $bootstrap->getPluginResource("db"); 
      $db = $dbResource->getDbAdapter(); 
     } 
    } 
} 

また、あなたはデフォルトなZend_Registryにオブジェクトを保存するために、あなたのブートストラップ・クラスでカスタムのinitメソッドを書くことができます:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initDb() 
    { 
    if ($this->hasPluginResource("db")) { 
     $dbResource = $this->getPluginResource("db"); 
     $db = $dbResource->getDbAdapter(); 
     Zend_Registry::set("db", $db); 
    } 
    } 
} 

今、あなたは一歩の代わりに、3であなたのdbオブジェクトにアクセスすることができます:

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $db = Zend_Registry::get("db"); 
    } 
} 

個人的には、ブートストラップでリソースレジストリに一度だけアクセスする必要があるため、私は第2の手法を使用します。最初の例では、すべてのコントローラに同じコードブロックをコピーする必要がありました。

+1

レジストリにdbを入れるのは悪い習慣なので、私は投票しました。 Zend_Controller_Actionを拡張し、保護されたプロパティとしてブートストラップからdbを取得する必要があります。 – venimus

関連する問題