Enregistrement de L'Adaptateur de base de données Zend dans le Registre
je cherche à enregistrer une référence à L'adaptateur principal de la base de données dans le Registre lors du Bootstrapping afin qu'il puisse être utilisé ailleurs dans mon site (en particulier l'action D'autorisation).
j'ai implémenté une correction moche où je crée un objet table de base de données et j'appelle la méthode getAdapter() dessus et je passe par là. Cependant, c'est une mauvaise façon de le faire et je voudrais qu'il soit disponible via le registre.
est ce que quelqu'un sait comment faire cela? Toute aide ou les pointeurs dans la bonne direction sont appréciées!
Cheers Stuart
Ps. Im en utilisant le Zend Framework 1.8.
9 réponses
si vous utilisez Zend Framework 1.8+, et que vous avez créé votre projet avec l'outil en ligne de commande, alors c'est aussi simple que d'enregistrer les paramètres de votre 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 pas besoin de faire quoi que ce soit dans votre Bootstrap.php
fichier, car il le fera pour vous. Aussi, par la définition de la isDefaultTableAdapter
true
, vous pouvez obtenir une instance de l'adaptateur de base de données n'importe où dans votre application.
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
Merci pour les réponses. Ive a décidé de changer la accepté de répondre et de poster la solution que j'ai finalement utilisé - qui est incroyablement simple à la fin!!
C'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ès qu'ailleurs...
$dbAdapter = Zend_Registry::get("db");
Merci pour l'aide et j'espère que cela aide quelqu'un d'autre.
manquer la meilleure chose :)
si vous utilisez les modèles Zend_Db_Table (vous devriez l'être) etc alors 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 soin de - de cette façon vous n'avez pas vraiment besoin de le sauvegarder dans le registre ou de se soucier de la connexion avant d'exécuter une requête à travers le modèle.
- je faire enregistrer dans le registre pour les utiliser plus tard si besoin mais je peut supprimer ce
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);
}
}
Mes 2 cents...
comment saisir L'Adaptateur DB par défaut:
À Partir De Bootstrap:
<?php
$dbResource = $this->getPluginResource('db');
db = $dbResource->getDbAdapter();
var_dump($db);
?>
D'un Controller il y a 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);
?>
consultez la documentation de zend à : 15.5.3.3. Stockage d'une base de données D'adaptateurs 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 cherchez?
Edit:
pour charger votre configuration à partir d'un fichier ini, utilisez:
parse_ini_file($fichier ini)
;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);
j'ai une méthode dans mon bootstrap pour ajouter l'adaptateur au registre. Je préfère une solution plus propre, mais ça fonctionne:
protected function _initRegistry(){
$this->bootstrap('db');
$db = $this->getResource('db');
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Registry::set('db', $db);
}
Voici ce que je fais:
à l'Intérieur du fichier de démarrage:
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 =
regardez:
si vous utilisez Zend Framework 1.8, faites quelque chose comme ça dans votre controller/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 à quelque chose comme 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 trouvent à l'intérieur DbTable répertoire sera comme 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);
}
}
Alors j'aurais la même application.ini généré par Zend Framework avec ce petit outre:
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 ce que j'ai fait sans avoir à changer les fichiers bootstrap.
Je ne voulais pas utiliser le Registre pour stocker un objet auquel je devrais pouvoir accéder, donc j'ai creusé un peu. Il s'avère que le bootstrap est enregistré en tant que paramètre du controller avant "bootstrap", qui est accessible depuis n'importe lequel de vos controllers comme expliqué dans cette page de manuel pour Zend_Application.
donc dans vos classes de controller 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();