2009-11-14 6 views
6

En supposant que vous soyez proche des conventions d'un ZendApplication, où devez-vous configurer un gestionnaire de base de données auquel les développeurs d'applications peuvent accéder? Je sais comment installer un adaptateur ZendDb. Ce que je veux savoir, dans le contexte de Zend Framework, comment les développeurs devraient instancier leurs gestionnaires de base de données afin qu'ils n'aient pas à s'inquiéter de plusieurs instanciations dans une même requête, fournissant des informations d'identification à chaque fois, etcQuelle est la «bonne» manière de fournir une application Zend avec un gestionnaire de base de données?

Pour Par exemple, lorsqu'un développeur utilise Code Igniter et doit exécuter une requête arbitraire, il y a un gestionnaire de base de données sur le contrôleur.

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

Quel est l'équivalent Zend de cette convention? Pour être clair, je peux penser à une demi-douzaine de façons d'y parvenir en utilisant les outils fournis par Zend Framework. Ce que je cherche, c'est comment Zend Framework, dans le cas général, veut que vous fassiez cela.

Répondre

18

L'idée est que votre Bootstrap lit un fichier de configuration et vous déclarez les entrées de configuration pour décrire l'adaptateur de base de données que vous souhaitez créer:

[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 

Si vous utilisez les touches de configuration suivantes de la convention à droite, cela signale automatiquement la classe de base Bootstrap pour créer et initialiser un objet Zend_Application_Resource_Db et le stocke dans le bootstrap resource registry. Plus tard, dans votre contrôleur, vous pouvez accéder au registre des ressources. note: J'ai modifié ce code après l'avoir testé un peu plus.

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

Vous pouvez écrire une méthode d'initialisation personnalisée dans votre classe Bootstrap, pour sauver un objet dans le Zend_Registry par défaut:

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); 
    } 
    } 
} 

Maintenant, vous pouvez accéder à votre objet db en une seule étape au lieu de trois :

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

Personnellement, j'utiliser la deuxième technique, parce que je dois accéder à une seule fois le registre des ressources, dans mon bootstrap. Dans le premier exemple, je devrais copier le même bloc de code à tous mes contrôleurs.

+1

J'ai voté parce que mettre DB dans le Registre est une mauvaise pratique. Vous devriez étendre Zend_Controller_Action et obtenir db de bootstrap en tant que propriété protégée. – venimus

Questions connexes