Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

ZF, configurar una BBDD por módulo

Estas en el tema de ZF, configurar una BBDD por módulo en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola. A ver si pueden ayudarme con esto, por favor. Estoy partiendo con una aplicación modular hecha en ZF 1.9. Hasta ahora todo bien, carga ...
  #1 (permalink)  
Antiguo 11/01/2010, 13:26
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
ZF, configurar una BBDD por módulo

Hola.

A ver si pueden ayudarme con esto, por favor.

Estoy partiendo con una aplicación modular hecha en ZF 1.9.

Hasta ahora todo bien, carga los controladores, vistas y modelos sin problemas. Estoy usando un Bootstrap por cada módulo.

Sin embargo, tengo la necesidad de configurar un adaptador distinto por cada módulo, para acceder a la base de datos.
Supongo que tengo que hacerlo en cada Bootstrap, sin embargo, no lo he conseguido.

Como debo hacerlo ?

Saludos!!
  #2 (permalink)  
Antiguo 11/01/2010, 15:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: ZF, configurar una BBDD por módulo

Pues solamente crea tu adaptador en el bootstrap y lo registras en el registry:

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

Para que sea usado dentro de ese módulo.

Saludos.
  #3 (permalink)  
Antiguo 11/01/2010, 20:56
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ZF, configurar una BBDD por módulo

Gracias por responder GatorV.

La idea es no tener que estar configurando el adaptador en cada modelo y me parece que al usar Registry tendría que ser así.

Me gustaría que fuera algo como lo siguiente, en los Bootstrap.php de cada módulo :

Código PHP:
protected function _initDataBase()
    {
        
$config = new Zend_Config(
            array(
                
'database' => array(
                    
'adapter' => 'Pdo_Mysql',
                    
'params'  => array(
                        
'host'     => 'localhost',
                        
'username' => 'usuario',
                        
'password' => 'clave',
                        
'dbname'   => 'nombre_bd'
                    
)
                )
            )
        );
        
$db Zend_Db::factory($config->database);
        
$db->getConnection();
        
Zend_Db_Table_Abstract::setDefaultAdapter($db);
    } 
Y que en los modelos correspondientes a ese módulo no sea necesario configurar o seleccionar el adaptador a usar.

Quizá no se puede, aunque sería extraño dada la flexibilidad de ZF.

Saludos!!

Última edición por claudiosalazarb; 13/01/2010 a las 12:12
  #4 (permalink)  
Antiguo 11/01/2010, 20:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: ZF, configurar una BBDD por módulo

Pues tal como lo pones te debería de funcionar esa es la idea del Bootstrap, te marca algún error?

Saludos.
  #5 (permalink)  
Antiguo 13/01/2010, 12:07
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ZF, configurar una BBDD por módulo

Pues no funciona.

Se puede configurar sólo una vez el adaptador por defecto.

El manual dice lo siguiente : "setting a default adapter is limited to a single adapter instance". Por eso, cada vez que configuraba una segunda instancia, ya sea en un segundo bootstrap de un módulo, o en el archivo application.ini, funcionaba sólo la primera instancia.

Ref : http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.constructing.defa ult-adapter

Finalmente, di con la forma de indicar en cada modelo el adaptador a usar.

Leí este artículo : http://jaybill.com/2007/09/12/using-the-zend-framework-with-multiple-databases/

Pero lo hice con algunos cambios :

1. En el bootstrap cree la siguiente función :

Código PHP:
protected function _initDatabases()
    {
        
$config = array(
            
'db' => array(
                
'acceso' => array(
                    
'adapter' => 'pdo_mysql',
                    
'params'  => array(
                        
'host'     => 'localhost',
                        
'username' => 'user',
                        
'password' => 'pass',
                        
'dbname'   => 'dbacceso'
                    
),
                    
'default' => true
                
),
                
'sistema' => array(
                    
'adapter' => 'pdo_mysql',
                    
'params'  => array(
                        
'host'     => 'localhost',
                        
'username' => 'user',
                        
'password' => 'pass',
                        
'dbname'   => 'dbsistema'
                    
)
                )
            )
        );
        
        
$databases = new Zend_Config($config);
        
        
$dbAdapters = array();
        
        foreach(
$databases->db as $config_name => $db){
        
            
$dbAdapters[$config_name] = Zend_Db::factory($db->adapter$db->params->toArray());
            if((boolean)
$db->default){
                
Zend_Db_Table::setDefaultAdapter($dbAdapters[$config_name]);
            }
        }
        
Zend_Registry::set('dbAdapters'$dbAdapters);
    } 
2. Cree la clase abstracta "App_Db_Table_Abstract" extendiendo "Zend_Db_Table_Abstract", de la siguiente forma :

Código PHP:
abstract class App_Db_Table_Abstract extends Zend_Db_Table_Abstract
{

    function 
App_Db_Table_Abstract($config null){

        if(isset(
$this->_use_adapter)){

            
$dbAdapters Zend_Registry::get('dbAdapters');
            
$config = ($dbAdapters[$this->_use_adapter]);

        }
        return 
parent::__construct($config);
    }


3. Finalmente, en cada modelo que uso agregué una variable que indica el adaptador a usar :

Código PHP:
class Sistema_Model_Proveedor extends App_Db_Table_Abstract
{
    protected 
$_name 'proveedores';
    protected 
$_primary 'id';
    protected 
$_use_adapter 'sistema';

Con eso solucioné el problema.

No sé si exista algo mejor, pero por ahora lo usaré ya que funciona bien y es fácil de quitar en caso que encuentre una forma mejor.

Si tienen alguna sugerencia sobre como optimizar la propuesta actual, bienvenida será!.

Saludos !!
  #6 (permalink)  
Antiguo 13/01/2010, 14:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: ZF, configurar una BBDD por módulo

Es una buena forma, y respecto a la restricción que pones es para cada adaptador no tiene nada que ver con el bootstrap. Pero creo que la solución que expones esta muy bien adaptada.

Saludos.
  #7 (permalink)  
Antiguo 15/01/2010, 13:07
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: ZF, configurar una BBDD por módulo

Haciendo memoria, cuando creas un modulo. desde Zend_Tools te crea las carpetas

/controllers
/models
/views
/config


Dentro de config pones un application.ini con los datos de configuracion de la base que usa ese modulo.

Sino es asi avisame y te explico como tener un application.ini en cada modulo
__________________
blog
  #8 (permalink)  
Antiguo 15/01/2010, 19:19
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ZF, configurar una BBDD por módulo

Pablo.

Sería ideal saberlo. Porque aunque la solución que implemente me sirve, no está demás saber como debería haber sido la solución a mi planteamiento original.

Lamentablemente el sistema no fue hecho con zend tool, ya que fue una actualización de uno que estaba hecho con una versión antigua de zend framework.

Cuando comience uno nuevo lo haré con zend tool.

Saludos!!
  #9 (permalink)  
Antiguo 18/01/2010, 08:50
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: ZF, configurar una BBDD por módulo

Leete esto

http://blog.easytech.com.ar/2009/08/...end_framework/

Ahi tenes la solucion, necesitas agregar unas lineas en el bootstrap para que mergee los application ini de cada modulo.
__________________
blog
  #10 (permalink)  
Antiguo 18/01/2010, 09:56
 
Fecha de Ingreso: octubre-2009
Mensajes: 240
Antigüedad: 14 años, 6 meses
Puntos: 6
Respuesta: ZF, configurar una BBDD por módulo

Hola, leyendo este post, se me generaron un par de dudas.

1- Cual es la ventaja de tener un Bootstrap por modulo? (no es mejor tener el Bootstrap general tal como lo arma zend tool y no tener que repetir codigo en todos los bootstrap)

2- Cuando trabajamos con un Bootstrap por modulo el bootstrap principal de la aplicacion se elimina? O se puede trabajar con un bootsrap general + los boostrap de los modulos.

Gracias desde ya.
  #11 (permalink)  
Antiguo 18/01/2010, 09:58
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: ZF, configurar una BBDD por módulo

La idea de enviarte el link era para que veas lo del config por modulo.

En su momento vimos que ZF carga todos los modulos constantemente y agregar modulos hacia un poco mas lento la carga ( a veces mucho mas lento).

Por eso implementamos un bootstrap por modulo. Despues eso evoluciono a un Bootstrap del estilo Easytech_Application_Bootstrap_Bootsrap que no debe estar en el ejemplo.

Ademas era porque cada modulo tenia 3 submodulos, pero eso es otra historia :D
__________________
blog
  #12 (permalink)  
Antiguo 29/01/2010, 05:20
 
Fecha de Ingreso: enero-2010
Mensajes: 14
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: ZF, configurar una BBDD por módulo

Yo para conectarme a diferentes Basesdedatos uso esta funcion en el Bootstrap.php:

Código:
protected function _initDatabaseRegistry()
{        	
//Obtenemos el nombre de la url 
$direc = $_SERVER['SERVER_NAME'];
		
//definimos el nombre de la bd y la tabla
if ($direc == "www.pag.com"){$table_name = 'em_t1';	$db_selection = 'db_es';}
elseif ($direc == "ar.pag.com"){$table_name = 'em_t2'; $db_selection = db_ar';}
elseif ($direc == 'cl.pag.com'){$table_name = 'em_t3'; $db_selection = 'db_cl';}
elseif ($direc == 'co.pag.com'){$table_name = 'em_t4';	$db_selection = 'db_co';}
elseif ($direc == 'mx.pag.com'){$table_name = 'em_t5_mx';	$db_selection = 'db_mx';}
elseif ($direc == 'it.pag.com'){$table_name = 'em_t6_it'; $db_selection = 'db_it';}
elseif ($direc == 'fr.pag.com'){$table_name = 'em_t7_fr'; $db_selection = 'db_fr';}
	elseif ($direc == 'uk.pag.com'){$table_name = 'em_t8_uk'; $db_selection = 'db_uk';}
	elseif ($direc == 'de.pag.com'){$table_name = 'em_t8_de'; $db_selection = 'db_de';}
	elseif ($direc == 'us.pag.com'){$table_name = 'em_t9_us'; $db_selection = 'db_us';}
	elseif ($direc == 'in.pag.com'){$table_name = 'em_t10_in'; $db_selection = 'db_in';}
	elseif ($direc == 'ij.pag.com'){$table_name = 'em_t11';	$db_selection = 'db_ij';}
		
// carga de configuracion
$dbconf = $this->getOption($db_selection);
//definimos la tabla de la base de datos
define($table_name, $dbconf->db->table->prefix);
// cargar conexion
$db = new Zend_Db_Adapter_Pdo_Mysql ($dbconf);
// guardar en registro
Zend_Registry::set ( "database", $db );
		
return $db;
}
Con esto consigo que segun la url que ingrese pueda acceder a una base de datos y su tabla correspondiente.

$db_selection = 'db_es' hacen referencia a las definiciones del application.ini de las bbdd.

$table_name = 'em_t1' lo uso en el modulo unico que tengo para hacer las consultas y que las consultas que uiero hacer son las mismas para todas las bbdd y las estructuras de las tablas son iguales.

Por si a alguien le puede resultar util.
  #13 (permalink)  
Antiguo 29/01/2010, 06:47
 
Fecha de Ingreso: septiembre-2006
Mensajes: 37
Antigüedad: 17 años, 7 meses
Puntos: 0
Paso de moda el switch?
Que lastima tan prolijo que quedaba



Ya paso de moda el switch?

Tan prolijo que quedaba en el codigo


Última edición por GatorV; 29/01/2010 a las 10:05

Etiquetas: bbdd, configurar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:59.