Ver Mensaje Individual
  #5 (permalink)  
Antiguo 13/01/2010, 12:07
claudiosalazarb
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 3 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 !!