web-dev-qa-db-fra.com

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 lors du démarrage afin qu'il puisse être utilisé ailleurs dans mon site (en particulier l'action d'autorisation).

J'ai implémenté un correctif laid où je crée un objet Table de base de données et appelle la méthode getAdapter () dessus et je passe par là. Cependant, c'est une mauvaise façon de le faire et j'aimerais qu'il soit disponible via le registre.

Est-ce que quelqu'un sait comment faire ça? Toute aide ou indication dans la bonne direction est appréciée!

Cheers Stuart

Ps. J'utilise Zend Framework 1.8.

37
Stuart

Si vous utilisez Zend Framework 1.8+ et avez créé votre projet avec l'outil de ligne de commande, alors c'est aussi simple que d'enregistrer vos paramètres de base de données dans votre 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 rien à faire dans votre Bootstrap.php fichier car il le fera pour vous. De plus, en définissant le paramètre isDefaultTableAdapter sur 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);
71
Andrew

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

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

Alors accédez à ça ailleurs avec ...

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

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

12
Stuart

Vous manquez la meilleure chose :)

Si vous utilisez les modèles Zend_Db_Table (vous devriez l'être), etc., vous pouvez configurer un adaptateur par défaut - de cette façon lorsque vous instanciez un modèle la connexion DB qu'il a pris en charge - de cette façon, vous n'avez pas vraiment besoin de l'enregistrer dans le registre ou de déranger sur la connexion avant d'exécuter une requête via le modèle.

Je l'enregistre dans le registre pour une utilisation ultérieure si nécessaire, mais je peux 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);
    }
}
7
Ian Warner

Mes 2 cents ...

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);
?>
4
Julian

J'ai une méthode dans mon bootstrap pour ajouter l'adaptateur au registre. Je préférerais une solution plus propre, mais cela fonctionne:

protected function _initRegistry(){

    $this->bootstrap('db');
    $db = $this->getResource('db');

    $db->setFetchMode(Zend_Db::FETCH_OBJ);

    Zend_Registry::set('db', $db);
}
1

Si vous utilisez Zend Framework 1.8, faites simplement quelque chose comme ceci dans votre contrôleur/action:

class CreateorderController extends Zend_Controller_Action
{
    public function testAction()
    {
        //more code
        $users_obj = new Default_Model_Users(); //this would load the model using the Default namespace
        //more code
    }
}

Ma classe Defaul_Model_Users ressemblerait à ceci:

<?php
/**
 * application/models/Users.php
 */
class Default_Model_Users extends Zend_Db_Table
{
    protected $_table;

    public function getTable()
    {
        if(null === $this->_table) {
            $this->_table = new Default_Model_DbTable_Users();
        }
        return $this->_table;
    }

    public function fetchAll()
    {
        $result = $this->getTable()->fetchAll();

        return $result;
    }
}

Et la partie du modèle qui "interagit" directement avec les tables de base de données se trouve dans le répertoire DbTable ressemblera à ceci:

<?php
/**
 * application/models/DbTable/Users.php
 */
class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name = 'users';

    public function init()
    {
        $this->_db->setFetchMode(Zend_Db::FETCH_OBJ);
    }
}

Ensuite, j'aurais le même application.ini généré par Zend Framework avec ce petit ajout:

resources.db.adapter               = "PDO_MYSQL"
resources.db.params.Host           = "localhost"
resources.db.params.dbname         = "mydb"
resources.db.params.username       = "root"
resources.db.params.password       = "password"

C'est comme ça que je me suis débrouillé sans avoir à changer les fichiers bootstrap.

1
wenbert

Voici ce que je fais:

À l'intérieur du bootstrap:

define('CONFIG_FILE', '../config/general.ini');
define('APP_MODE', 'development');

À l'intérieur de l'initialiseur:

 /**
 * Initialize data bases
 * 
 * @return void
 */
public function initDb ()
{
    $options = Zend_Registry::get('conf');
    $db = Zend_Db::factory($options->database);
    $db->query(new Zend_Db_Expr('SET NAMES utf8'));
    Zend_Registry::set('db', $db);
}

public function initConfig ()
{
    if (file_exists(CONFIG_FILE) && is_readable(CONFIG_FILE)) {
        $conf = new Zend_Config_Ini(CONFIG_FILE, APP_MODE);
        Zend_Registry::set('conf', $conf);
    } else {
        throw new Zend_Config_Exception('Unable to load config file');
    }
}

Et enfin mon fichier de configuration ressemble à ceci:

[production]
database.adapter         = pdo_Mysql
database.params.Host     = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname   = dbname

; Overloaded configuration from production

[development : production]
database.params.Host     = localhost
database.params.username = root
database.params.password = 

Jeter un coup d'œil à:

1
Boris Guéry

Je ne voulais pas utiliser le registre pour stocker un objet auquel je devrais pouvoir accéder, j'ai donc creusé un peu. Il s'avère que le bootstrap est enregistré en tant que paramètre de contrôleur frontal "bootstrap", qui est accessible depuis n'importe lequel de vos contrôleurs comme expliqué dans cette page de manuel pour Zend_Application .

Ainsi, dans vos classes de contrôleur, vous pouvez obtenir l'adaptateur db qui a été défini dans votre fichier ini comme ceci:

$bootstrap = $this->getInvokeArg('bootstrap');
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();
1
Vishal Parpia