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

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

.Comment obtenir une ressource bootstrap dans un plugin de contrôleur dans Zend Framework

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

    } 
} 

Répondre

31

Vous pouvez toujours obtenir une référence au contrôleur avant:

$front = Zend_Controller_Front::getInstance(); 

A partir de ce que vous pouvez obtenir le bootstrap:

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

De la bootstrap vous pouvez obtenir des plugins bootstrap:

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

Mais c'est beaucoup de plomberie supplémentaire!

Honnêtement, vous seriez mieux stocker l'objet adaptateur de base de données dans le registre au cours de votre bootstrap:

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; 
} 

Ensuite, vous pouvez obtenir l'adaptateur de base de données partout:

Zend_Registry::get("database"); 

Voir aussi mon répondre à What is the “right” Way to Provide a Zend Application With a Database Handler

+0

Pourquoi getResource ("db") fonctionne dans mon cas et non getResource ("base de données")? –

+1

Il utilise simplement une clé en fonction du nom de ressource que vous avez écrit dans votre fichier de configuration bootstrap. Par exemple si préfixe vos paramètres de configuration avec 'resource.db' alors il utilisera' db'. –

5

[Je dois vérifier cela par rapport à du code de travail sur une autre machine. Je crois que c'est quelque chose comme ça ...]

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

Dommage, il n'y a rien comme Zend_Controller_ActiongetInvokeArg("bootstrap") dans un plugin. Vous pouvez toujours obtenir la référence d'amorçage par le contrôleur avant:

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

Mais ce que je fais habituellement est

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

puis dans votre plugin:

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

plus facile, et la base de données peut être récupéré à peu près partout dans l'application.

0

$ db = Zend_Db_Table :: getDefaultAdapter();

Questions connexes