2009-11-14 14 views
6

Suponiendo que está cumpliendo con las convenciones de ZendApplication, ¿dónde debe configurar un manejador de base de datos para que los desarrolladores de aplicaciones tengan acceso?¿Cuál es la forma "correcta" de proporcionar una aplicación Zend con un manejador de base de datos

Sé cómo configurar un adaptador ZendDb. Lo que quiero saber es, en el contexto del Zend Framework, cómo deben los desarrolladores crear instancias de sus manejadores de bases de datos para que no tengan que preocuparse por múltiples instancias en una solicitud, proporcionando credenciales cada vez, etc.

For Por ejemplo, cuando un desarrollador usa Code Igniter y necesita ejecutar una consulta arbitraria, hay un controlador de base de datos en el controlador.

$this->db->query(.... 

¿Cuál es el equivalente de Zend de esta convención? Para ser claros, puedo pensar en media docena de maneras de lograr esto utilizando las herramientas que ofrece Zend Framework. Lo que estoy buscando es cómo Zend Framework, en el caso general, quiere que hagas esto.

Respuesta

18

La idea es que su Bootstrap lee un archivo de configuración y se declaran las entradas de configuración para describir el adaptador de la base de datos que desea crear:

[bootstrap] 
resources.db.adapter = Pdo_Mysql 
resources.db.params.dbname = "mydatabase" 
resources.db.params.username = "webuser" 
resources.db.params.password = "XXXX" 
resources.db.isDefaultTableAdapter = true 

Si utiliza las teclas de configuración después de la convención de la derecha, esto indica de forma automática la clase base Bootstrap para crear e inicializar un objeto Zend_Application_Resource_Db, y lo almacena en el bootstrap resource registry.

Más tarde en su Controlador, puede acceder al registro de recursos. nota: He editado este código después de probarlo un poco más.

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $bootstrap = $this->getInvokeArg("bootstrap"); 
     if ($bootstrap->hasPluginResource("db")) { 
      $dbResource = $bootstrap->getPluginResource("db"); 
      $db = $dbResource->getDbAdapter(); 
     } 
    } 
} 

Como alternativa, puede escribir un método init personalizado en su clase Bootstrap, para salvar un objeto en el Zend_Registry defecto:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initDb() 
    { 
    if ($this->hasPluginResource("db")) { 
     $dbResource = $this->getPluginResource("db"); 
     $db = $dbResource->getDbAdapter(); 
     Zend_Registry::set("db", $db); 
    } 
    } 
} 

Ahora puede acceder a su objeto db en un solo paso en lugar de tres :

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $db = Zend_Registry::get("db"); 
    } 
} 

en lo personal, me gustaría utilizar la segunda técnica, porque entonces tengo que tener acceso al registro de recursos sólo una vez, en mi rutina de carga. En el primer ejemplo, tendría que copiar el mismo bloque de código a todos mis Controladores.

+1

He votado en contra porque colocar db en el Registro es una mala práctica. Debe extender Zend_Controller_Action y obtener db de bootstrap como propiedad protegida. – venimus

Cuestiones relacionadas