Hola, tengo ya tiempo peleándome con lo siguiente:
Tengo una aplicación web en la que por requerimiento de mi cliente quiere tener la posibilidad de que al momento de hacer login pueda elegir entre conectarse a una base de datos u otra.
Para esto deben saber que estoy utilizando Doctrine 1.2 con Zend.
Al principio en el bootstrap tenía el siguiente codigo:
Código PHP:
protected function _initDoctrine()
{
//Añadir Doctrine al autoloader de Zend
$this->getApplication()->getAutoloader()
->pushAutoloader(array('Doctrine', 'autoload'));
//Llamar al autoloader de Doctrine para que cargue los modelos
spl_autoload_register(array('Doctrine', 'modelsAutoload'));
//Obtener los parámetros definidos en el archivo appication.ini
$doctrineConfig = $this->getOption('doctrine');
$manager = Doctrine_Manager::getInstance();
//Definir los atributos de acceso y de carga de modelos
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
$manager->setAttribute(
Doctrine::ATTR_MODEL_LOADING,
$doctrineConfig['model_autoloading']
);
Doctrine_Core::loadModels($doctrineConfig['models_path']);
//Crear la conexión a base de datos segun el DSN
$conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
//Definir la forma nativa ENUM
$conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
return $conn;
}
Sin embargo cuando fue necesario hacer este cambio decidí dejar solo esto:
Código PHP:
protected function _initDoctrine()
{
//Añadir Doctrine al autoloader de Zend
$this->getApplication()->getAutoloader()
->pushAutoloader(array('Doctrine', 'autoload'));
//Llamar al autoloader de Doctrine para que cargue los modelos
spl_autoload_register(array('Doctrine', 'modelsAutoload'));
//Obtener los parámetros definidos en el archivo appication.ini
$doctrineConfig = $this->getOption('doctrine');
$manager = Doctrine_Manager::getInstance();
//Definir los atributos de acceso y de carga de modelos
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
$manager->setAttribute(
Doctrine::ATTR_MODEL_LOADING,
$doctrineConfig['model_autoloading']
);
Doctrine_Core::loadModels($doctrineConfig['models_path']);
}
Si observamos, lo que ya no hago es definir el dsn de la conexión; esto lo omito porque lo que busco es definir el DSN en un plugin. Esta decisión la tome a partir de que
GatorV y
masterpuppet me dijeron que no podía manejar sesiones en el bootstrap y que era mejo hacerlo en un plugin.
Entonces lo que busqué hacer fue crear un plugin para definir el DSN a partir de la base de datos que el usuario eligiera; sin embargo cuando en el plugin integro lo siguiente:
Código PHP:
public function preDispatch (Zend_Controller_Request_Abstract $request)
{
$conn = Doctrine_Manager::connection("mysql://espacios_user:espacios.2013.db@localhost/espacios_db_test",'doctrine');
}
Tengo el siguiente error:
Código:
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'session has already been started by session.auto-start or session_start()' in /var/www/espacios/library/Zend/Session.php:451 Stack trace: #0 /var/www/espacios/library/Zend/Session/Namespace.php(143): Zend_Session::start(true) #1 /var/www/espacios/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth') #2 /var/www/espacios/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct() #3 /var/www/espacios/library/Zend/Auth.php(141): Zend_Auth->getStorage() #4 /var/www/espacios/application/plugins/Layout.php(8): Zend_Auth->hasIdentity() #5 /var/www/espacios/library/Zend/Controller/Plugin/Broker.php(309): Application_Plugin_Layout->preDispatch(Object(Zend_Controller_Request_Http)) #6 /var/www/espacios/library/Zend/Controller/Front.php(941): Zend_Controller_Plugin_Broker->preDispatch(Object(Zend_Controller_Request_Http)) #7 /var/www/espacios/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front in /var/www/espacios/library/Zend/Controller/Plugin/Broker.php on line 312
Cuando me deshago de esa línea, y la regreso al bootstrap ya no tengo problemas.
Espero haber sido claro, y que producto de esto alguien pueda ayudarme.
Gracias!