2009-05-28 11 views
37

Estoy buscando registrar una referencia al adaptador de base de datos principal en el registro durante el Bootstrapping para que pueda usarse en otro lugar de mi sitio (específicamente la acción Autorización).Registro del adaptador de base de datos Zend en el Registro

Implementé un arreglo feo donde creo un objeto de tabla de base de datos y llamo al método getAdapter() y lo paso. Sin embargo, esta es una mala forma de hacerlo y me gustaría que esté disponible a través del registro.

¿Alguien sabe cómo hacer esto? ¡Cualquier ayuda o indicadores en la dirección correcta son apreciados!

Saludos Stuart

Sal. Estoy usando Zend Framework 1.8.

+0

que he encontrado el mismo problema. Los documentos mencionan la recuperación de la instancia del adaptador: http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.db Pero esto no parece funcionar para mi. – jamiei

+0

Creo que lo que significa el OP es cómo se puede recuperar una instancia de la configuración predeterminada del adaptador usando la mención config/bootfile en la documentación aquí: http://framework.zend.com/manual/en/zend.application.available- resources.html # zend.application.available-resources.db – jamiei

Respuesta

71

Si está usando Zend Framework 1.8+, y creó su proyecto con el comando herramienta de línea, entonces es tan simple como registrar la configuración de su base de datos en su archivo de configuración application.ini.

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 la configuración de base de datos están precedidos por resources.db que ni siquiera tendrá que hacer nada en el archivo de Bootstrap.php, ya que lo hará por usted. Además, al establecer la configuración isDefaultTableAdapter en true, puede obtener una instancia de su adaptador de base de datos en cualquier lugar de su aplicación.

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

GRACIAS ... ¿Por qué diablos los documentos de ZF insisten en referirse siempre a '$ dbAdapter' con algún SQLite extraño de la configuración de la memoria ..' getDefaultAdapter() 'debería ser la forma predeterminada de referenciar el' $ dbAdapter' actual de manera consistente, a lo largo de los documentos. Bajeezus, SO nunca me falla. –

+1

jaja, ¡estoy de acuerdo! me alegro de poder ayudar – Andrew

1

Compruebe la documentación de zend en: 15.5.3.3. Almacenamiento de un adaptador de base de datos en el Registro

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

algo por el estilo que estás buscando?

Editar:
para cargar la configuración de un archivo ini, utilice:
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); 
+0

Eso es lo que he visto en los documentos y otros sitios, pero presumiblemente la $ options var contiene nombre de usuario, contraseña, dbName, etc. Pero en mi situación, estos se almacenan en la Aplicación. archivo ini. ¿Hay alguna forma de usar este archivo para llenar las opciones? ¡Gracias por la rápida respuesta! – Stuart

+0

Sí, puedes usar parse_ini_file. verifique mi edición – Silfverstrom

+0

No. Esto es la repetición del código. Lo que quiere decir es cómo puede recuperar una instancia del adaptador predeterminado sin volver a leer el archivo de configuración (lo que se hizo automáticamente en la clase Bootstrap). – jamiei

1

tengo un método en mi rutina de carga para agregar el adaptador para el registro. Yo preferiría una solución más limpia, pero funciona:

protected function _initRegistry(){ 

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

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

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

Aquí es lo que hago:

Dentro de la rutina de carga:

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

Dentro del inicializador:

/** 
* 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'); 
    } 
} 

Y finalmente mi archivo de configuración se ve así:

[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 = 

Tome un vistazo a:

+1

¡Esta * no * es la forma correcta de hacer las cosas! No es necesario cargar la configuración usted mismo en Bootstrap, Zend_Application lo hará automáticamente. Además, tiene un recurso para inicializar la base de datos. Simplemente especifique la base de datos en su aplicación ini según http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.db y la base de datos se inicializará automáticamente –

12

Gracias por las respuestas. He decidido cambiar la respuesta aceptada y publicar la solución que finalmente utilicé, ¡que es increíblemente simple al final!

Esto se basa fundamentalmente en comentario de Dcaunt ...

En la clase de arranque ..

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

    $db = $resource->getDbAdapter(); 

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

Luego de acceso que en otros lugares con ...

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

Gracias por la ayuda y espero que esto ayude a alguien más.

+0

// Mientras está en la clase de arranque, el acceso correcto a los recursos es: $ resource = $ this-> getPluginResource ('db'); –

+1

He agregado mi respuesta, ¡lo que lo hace aún más fácil! – Andrew

+0

Muy bien ... gracias por eso :) –

7

Su falta lo mejor :)

Si utiliza los modelos Zend_Db_Table (debería ser), etc, entonces puede configurar un adaptador por defecto - de esta manera cuando se instancia un modelo de la conexión de base de datos que se ocuparon de - De esta manera, realmente no necesita guardarlo en el registro ni preocuparse por la conexión antes de ejecutar una consulta a través del modelo.

hago lo guarda en el registro para su uso posterior, si es necesario, aunque - pero puedo eliminar esta

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

Gracias. Lo usé con pocos cambios. –

1

Si está utilizando Zend Framework 1.8 acaba de hacer algo como esto en su controlador/acción:

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

Mi clase Defaul_Model_Users sería algo como esto:

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

Y la parte del modelo que "interactúa" directamente con las tablas de la base se encuentra dentro del directorio DbTable se verá así:

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

entonces tendría el mismo application.ini generada por Zend Framework con esta pequeña adición :

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" 

Así es como yo lo hice sin sin tener que cambiar los archivos de arranque.

1

No quería utilizar el registro para almacenar un objeto al que debería poder acceder, así que lo exploré un poco. Resulta que el programa de arranque está registrado como el parámetro del controlador frontal "bootstrap", que se puede acceder desde cualquiera de sus controladores, tal como se explica en esta página de manual para Zend_Application.

Así que en sus clases de controlador se puede obtener el adaptador de db que se ha definido en el archivo ini así:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$resource = $bootstrap->getPluginResource('db'); 
$db = $resource->getDbAdapter(); 
4

Mi 2 centavos ...

Cómo agarrar el adaptador por defecto DB:

De Bootstrap:

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

desde un controlador, hay dos métodos:

<?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); 
?> 
Cuestiones relacionadas