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

.Come ottenere una risorsa bootstrap in un plug-in del controller in Zend Framework

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

    } 
} 

risposta

31

si può sempre ottenere un riferimento al front controller:

$front = Zend_Controller_Front::getInstance(); 

Da che si può ottenere il bootstrap:

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

Dal bootstrap puoi ottenere i plugin di bootstrap:

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

Ma questo è un sacco di tubature in più!

Onestamente, sarebbe meglio memorizzare l'oggetto adattatore di base di dati nel Registro di sistema durante il 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; 
} 

allora si può ottenere l'adattatore del database ovunque:

Zend_Registry::get("database"); 

Vedi anche la mia risposta a What is the “right” Way to Provide a Zend Application With a Database Handler

+0

Perché getResource ("db") funziona nel mio caso e non getResource ("database")? –

+1

Usa semplicemente una chiave in base al nome della risorsa che hai scritto nel tuo file di configurazione bootstrap. Ad esempio, se prefisso i parametri di configurazione con 'resource.db', ​​verrà usato' db'. –

5

[Ho bisogno di controllare questo con qualche codice funzionante su un'altra macchina. Credo che sia qualcosa di simile ...]

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

Peccato che non ci sia niente come Zend_Controller_Action 's getInvokeArg("bootstrap") in un plug-in. Si può sempre ottenere il riferimento bootstrap attraverso il front controller:

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

Ma quello che faccio di solito è

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

e poi nel vostro plugin:

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

Più facile, e il database può essere recuperato praticamente ovunque nell'applicazione.

0

$ db = Zend_Db_Table :: getDefaultAdapter();

Problemi correlati