Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/05/2013, 20:46
pixel1
 
Fecha de Ingreso: julio-2008
Ubicación: México
Mensajes: 150
Antigüedad: 16 años, 5 meses
Puntos: 4
Problemas con la sesión en Zend

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_OVERRIDEtrue);
        
$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_ENUMtrue);
     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_OVERRIDEtrue);
        
$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!
__________________
Blog blog.desarrollandoideas.com

Twitter
Sígueme en Twitter