zend-framework - fetch_obj - zend framework tutorial español
Registro de Zend Database Adapter en el Registro (9)
Esto es lo que hago:
Dentro del bootstrap:
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 =
Echa un vistazo a:
Estoy buscando registrar una referencia al adaptador principal de la base de datos en el registro durante el Bootstrapping para que pueda usarse en otro lugar de mi sitio (específicamente la acción Autorización).
Implementé un arreglo desagradable 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 como hacer esto? ¡Cualquier ayuda o indicadores en la dirección correcta son apreciados!
Cheers Stuart
PD. Estoy usando Zend Framework 1.8.
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 básicamente en el comentario de Dcaunt ...
En la clase de arranque ...
protected function _initDb()
{
$resource = $bootstrap->getPluginResource(''db'');
$db = $resource->getDbAdapter();
Zend_Registry::set("db", $db);
}
Luego acceda a eso en otro lugar con ...
$dbAdapter = Zend_Registry::get("db");
Gracias por la ayuda y espero que esto ayude a otra persona.
Le falta lo mejor :)
Si utiliza los modelos de Zend_Db_Table (debe ser), etc., puede configurar un adaptador predeterminado: de esta forma, al crear una instancia de un modelo de la conexión de BD, se cuidará de esta manera, de esta manera no es necesario guardarlo en el registro ni molestarse. sobre la conexión antes de ejecutar una consulta a través del modelo.
Lo guardo en el registro para su uso posterior si es necesario, pero puedo eliminarlo
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);
}
}
Mis 2 centavos ...
Cómo agarrar el adaptador de base de datos predeterminado:
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);
?>
No quería usar el registro para almacenar un objeto al que debería poder acceder, así que investigé un poco. Resulta que el bootstrap está registrado como el parámetro del controlador frontal "bootstrap", al que se puede acceder desde cualquiera de sus controladores, tal como se explica en esta página de manual para Zend_Application .
Entonces en sus clases de controlador puede obtener el adaptador de db que se ha definido en su archivo ini de esta manera:
$bootstrap = $this->getInvokeArg(''bootstrap'');
$resource = $bootstrap->getPluginResource(''db'');
$db = $resource->getDbAdapter();
Si está usando Zend Framework 1.8 simplemente haga 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 se vería así:
<?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 de datos se encuentra dentro del directorio de DbTable que 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 la misma aplicación.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 lo hice sin tener que cambiar los archivos de arranque.
Tengo un método en mi arranque para agregar el adaptador al registro. 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);
}
Verifique 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 así que estás buscando?
Editar:
para cargar su configuración desde un archivo interno, use:
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);
Si está usando Zend Framework 1.8+ y creó su proyecto con la herramienta de línea de comandos, entonces es tan simple como registrar la configuración de su base de datos en su archivo de configuración de 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 su base de datos está precedida por resources.db
, ni siquiera necesitará hacer nada en su archivo Bootstrap.php
porque lo hará por usted. Además, estableciendo la configuración de 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);