37 votes

Enregistrer l'adaptateur de base de données Zend dans le registre

Je cherche à enregistrer une référence à l'adaptateur de base de données principal dans le registre pendant l'amorçage afin qu'il puisse être utilisé ailleurs dans mon site (en particulier dans l'action d'autorisation).

J'ai mis en place une solution peu élégante qui consiste à créer un objet Table de base de données, à appeler la méthode getAdapter() sur cet objet et à le faire passer. Cependant, c'est une mauvaise façon de procéder et j'aimerais qu'elle soit disponible via le registre.

Quelqu'un sait-il comment faire ? Toute aide ou indication dans la bonne direction est appréciée !

Cheers Stuart

Ps. J'utilise Zend Framework 1.8.

71voto

Andrew Points 30079

Si vous utilisez Zend Framework 1.8+, et que vous avez créé votre projet avec l'outil de ligne de commande, alors il suffit d'enregistrer les paramètres de votre base de données dans le fichier application.ini fichier de configuration.

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "your.database.host"
resources.db.params.dbname = "database_name"
resources.db.params.username = "username"
resources.db.params.password = "password"
resources.db.isDefaultTableAdapter = true

Si vos paramètres de base de données sont précédés de resources.db vous n'aurez même pas besoin de faire quoi que ce soit dans votre Bootstrap.php car il le fera pour vous. De plus, en paramétrant l'option isDefaultTableAdapter pour true vous pouvez obtenir une instance de votre adaptateur de base de données n'importe où dans votre application.

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

13voto

Stuart Points 2115

Merci pour les réponses. J'ai décidé de changer la réponse acceptée et de poster la solution que j'ai finalement utilisée - qui est incroyablement simple en fin de compte !

Ceci est essentiellement basé sur Dcaunt's commentaire...

Dans la classe bootstrap..

protected function _initDb()
{
    $resource = $bootstrap->getPluginResource('db');

    $db = $resource->getDbAdapter();

    Zend_Registry::set("db", $db);
}

Puis accéder à cet ailleurs avec...

$dbAdapter = Zend_Registry::get("db");

Merci pour votre aide et j'espère que cela aidera quelqu'un d'autre.

7voto

Ian Warner Points 361

Vous ratez la meilleure chose qui soit :)

Si vous utilisez les modèles Zend_Db_Table (vous devriez), etc., vous pouvez alors mettre en place un adaptateur par défaut - de cette façon, lorsque vous instanciez un modèle, la connexion à la base de données est prise en charge - de cette façon, vous n'avez pas vraiment besoin de la sauvegarder dans le registre ou de vous soucier de la connexion avant de lancer une requête à travers le modèle.

Je l'enregistre dans le registre pour une utilisation ultérieure en cas de besoin, mais je vais peut-être le supprimer.

protected function _initDB()
{
    // Check that the config contains the correct database array.
    if ($this->_config->db) {

        // Instantiate the DB factory
        $dbAdapter = Zend_Db::factory($this->_config->db);

        // Set the DB Table default adaptor for auto connection in the models
        Zend_Db_Table::setDefaultAdapter($dbAdapter);

        // Add the DB Adaptor to the registry if we need to call it outside of the modules.
        Zend_Registry::set('dbAdapter', $dbAdapter);
    }
}

4voto

Julian Points 2595

Mes 2 centimes...

Comment récupérer l'adaptateur DB par défaut :

De Bootstrap :

<?php    
$dbResource = $this->getPluginResource('db');
db = $dbResource->getDbAdapter();
var_dump($db);
?>

À partir d'un contrôleur, il existe deux méthodes :

<?php
// Method 1
$bootstrap = $this->getInvokeArg('bootstrap');
$dbResource = $bootstrap->getPluginResource('db');
$dbAdapter = $dbResource->getDbAdapter();
var_dump($dbAdapter);

// Method 2
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
var_dump($dbAdapter);
?>

1voto

Silfverstrom Points 8132

Vérifiez la documentation zend à : 15.5.3.3. Stocker un adaptateur de base de données dans le registre

http://framework.zend.com/manual/en/zend.db.table.html

$db = Zend_Db::factory('PDO_MYSQL', $options);
Zend_Registry::set('my_db', $db);

// Later...

$table = new Bugs(array('db' => 'my_db'));

quelque chose comme ça que vous recherchez ?

Edit :
pour charger votre configuration à partir d'un fichier ini, utilisez :
parse_ini_file($inifile)

;configuration.ini
host = 127.0.0.1
user = username
password = blabla

;yourfile.php
$options = parse_ini_file('configuration.ini');

$db = Zend_Db::factory('PDO_MYSQL', $options);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X