2010-06-03 10 views
19
protected function _initDatabase() 
{ 
    $params = array(
      'host'  => '', 
      'username' => '', 
      'password' => '', 
      'dbname' => '', 
     ); 

    $database = Zend_Db::factory('PDO_MYSQL', $params); 
    $database->getConnection(); 
    return $database; 
} 

.Cómo obtener un recurso de arranque en un complemento de controlador en Zend Framework

class App_Controller_Plugin_Test extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Http $request) 
    { 
     // how i get database? 

    } 
} 

Respuesta

31

siempre se puede obtener una referencia al controlador frontal:

$front = Zend_Controller_Front::getInstance(); 

Desde que se puede obtener el archivo de arranque:

$bootstrap = $front->getParam("bootstrap"); 

Desde el arranque, puede obtener los complementos de arranque:

if ($bootstrap->hasPluginResource("database")) { 
     $dbResource = $bootstrap->getPluginResource("database"); 
} 
$db = $dbResource->getDatabase(); 

¡Pero eso es mucha plomería extra!

Honestamente, sería mejor almacenar el objeto adaptador de base de datos en el registro durante el arranque:

protected function _initDatabase() 
{ 
    $params = array(
      'host'  => '', 
      'username' => '', 
      'password' => '', 
      'dbname' => '', 
     ); 

    $database = Zend_Db::factory('PDO_MYSQL', $params); 
    $database->getConnection(); 
    Zend_Registry::set("database", $database); 
    return $database; 
} 

entonces se puede obtener el adaptador de la base de datos en cualquier lugar:

Zend_Registry::get("database"); 

Véase también mi respuesta a What is the “right” Way to Provide a Zend Application With a Database Handler

+0

¿Por qué getResource ("db") funciona en mi caso y no getResource ("base de datos")? –

+1

Simplemente usa una clave de acuerdo con el nombre del recurso que escribió en su archivo de configuración de arranque. Por ejemplo, si prefiges tus parámetros de configuración con 'resource.db', ​​entonces usará' db'. –

5

[Necesito comprobar esto contra algún código de trabajo en otra máquina. Creo que es algo como esto ...]

$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db'); 
6

Lástima que no hay nada como Zend_Controller_Action 's getInvokeArg("bootstrap") en un complemento. Siempre se puede obtener la referencia de arranque a través del controlador frontal:

$db = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("database"); 

Pero lo que suelo hacer es

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

y luego en su plugin:

try 
{ 
    $db = Zend_Registry::get('database'); 
} 
catch (Zend_Exception $e) 
{ 
    // do stuff 
} 

más fácil, y la base de datos puede ser recuperado prácticamente en cualquier lugar de la aplicación.

0

$ db = Zend_Db_Table :: getDefaultAdapter();

Cuestiones relacionadas