2009-05-28 4 views
37

Sto cercando di registrare un riferimento all'adattatore del database principale nel registro durante il bootstrap in modo che possa essere utilizzato altrove nel mio sito (in particolare l'azione di autorizzazione).Registrazione della scheda di database Zend nel registro

Ho implementato una brutta correzione in cui creo un oggetto tabella di database e chiamo su di esso il metodo getAdapter() e lo passo. Tuttavia, questo è un cattivo modo di farlo e mi piacerebbe che fosse disponibile tramite il registro.

Qualcuno sa come fare questo? Qualsiasi aiuto o suggerimento nella giusta direzione sono apprezzati!

Acclamazioni Stuart

Ps. Sto usando Zend Framework 1.8.

+0

che ho incontrato lo stesso problema. I documenti menzionano il richiamo dell'istanza dell'adapter: http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.db Ma questo non sembra funzionare per me. – jamiei

+0

Penso che l'OP significhi come si può recuperare un'istanza della configurazione predefinita dell'adattatore usando la menzione config/bootfile nella documentazione qui: http://framework.zend.com/manual/en/zend.application.available- resources.html # zend.application.available-resources.db – jamiei

risposta

71

Se si sta utilizzando Zend Framework 1.8+, e ha creato il progetto con il comando strumento linea, allora è così semplice come la registrazione le impostazioni del database nel file di configurazione application.ini.

resources.db.adapter = "PDO_MYSQL" 
resources.db.params.host = "your.database.host" 
resources.db.params.dbname = "database_name" 
resources.db.params.username = "username" 
resources.db.params.password = "password" 
resources.db.isDefaultTableAdapter = true 

Se le impostazioni del database sono preceduti da resources.db non sarà nemmeno bisogno di fare qualcosa nel file Bootstrap.php perché lo farà per voi. Inoltre, impostando l'impostazione isDefaultTableAdapter a true, è possibile ottenere un'istanza della scheda del database in qualsiasi punto dell'applicazione.

$dbAdapter = Zend_Db_Table::getDefaultAdapter(); 
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); 
+10

GRAZIE ... Perché diamine, i doc ZF insistono nel riferirsi sempre a '$ dbAdapter' con qualche strano SQLite dall'impostazione della memoria ..' getDefaultAdapter() 'dovrebbe essere il modo predefinito per fare riferimento al corrente' $ dbAdapter' in modo coerente, attraverso i documenti. Bajeezus, SO non mi manca mai. –

+1

haha, sono d'accordo! felice di poterti aiutare – Andrew

1

Controllare la documentazione di zend all'indirizzo: 15.5.3.3. Memorizzazione di un adattatore di database nel Registro

http://framework.zend.com/manual/en/zend.db.table.html

$db = Zend_Db::factory('PDO_MYSQL', $options); 
Zend_Registry::set('my_db', $db); 

// Later... 

$table = new Bugs(array('db' => 'my_db')); 

qualcosa del genere che stai cercando?

Edit:
per caricare la configurazione da un file INI, utilizzare:
parse_ini_file($inifile)

;configuration.ini 
host = 127.0.0.1 
user = username 
password = blabla 

;yourfile.php 
$options = parse_ini_file('configuration.ini'); 

$db = Zend_Db::factory('PDO_MYSQL', $options); 
+0

Questo è ciò che si vede nei documenti e in altri siti ma presumibilmente le opzioni $ var contengono nome utente, password, dbName ecc ecc. Ma nella mia situazione questi sono memorizzati nell'applicazione. file ini. C'è un modo per usare questo file per popolare le opzioni? Grazie per la risposta rapida! – Stuart

+0

Sì, puoi usare parse_ini_file. controlla la mia modifica – Silfverstrom

+0

No. Questa è la ripetizione del codice. Quello che intende è come si può recuperare un'istanza dell'adattatore predefinito senza leggere nuovamente il file di configurazione (che è stato fatto automaticamente nella classe Bootstrap). – jamiei

1

Ho un metodo nel mio bootstrap per aggiungere l'adattatore al Registro di sistema. Preferirei una soluzione più pulita, ma funziona:

protected function _initRegistry(){ 

    $this->bootstrap('db'); 
    $db = $this->getResource('db'); 

    $db->setFetchMode(Zend_Db::FETCH_OBJ); 

    Zend_Registry::set('db', $db); 
} 
1

Ecco quello che faccio:

All'interno del bootstrap:

define('CONFIG_FILE', '../config/general.ini'); 
define('APP_MODE', 'development'); 

All'interno del Initializer:

/** 
* Initialize data bases 
* 
* @return void 
*/ 
public function initDb() 
{ 
    $options = Zend_Registry::get('conf'); 
    $db = Zend_Db::factory($options->database); 
    $db->query(new Zend_Db_Expr('SET NAMES utf8')); 
    Zend_Registry::set('db', $db); 
} 

public function initConfig() 
{ 
    if (file_exists(CONFIG_FILE) && is_readable(CONFIG_FILE)) { 
     $conf = new Zend_Config_Ini(CONFIG_FILE, APP_MODE); 
     Zend_Registry::set('conf', $conf); 
    } else { 
     throw new Zend_Config_Exception('Unable to load config file'); 
    } 
} 

Infine il mio file di configurazione è il seguente:

[production] 
database.adapter   = pdo_Mysql 
database.params.host  = db.example.com 
database.params.username = dbuser 
database.params.password = secret 
database.params.dbname = dbname 

; Overloaded configuration from production 

[development : production] 
database.params.host  = localhost 
database.params.username = root 
database.params.password = 

Date un'occhiata a:

+1

Questo * non * è il modo giusto di fare le cose! Non è necessario caricare la configurazione da soli nel Bootstrap, Zend_Application lo farà automaticamente. Inoltre, ha una risorsa per inizializzare il database. Basta specificare il database nell'applicazione ini secondo http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.db e il database verrà inizializzato automaticamente –

12

Grazie per le risposte. Ho deciso di cambiare la risposta accettata e pubblicare la soluzione che ho finalmente usato - che alla fine è incredibilmente semplice !!

Questo è fondamentalmente basata su di Dcaunt commento ...

Nella classe di bootstrap ..

protected function _initDb() 
{ 
    $resource = $bootstrap->getPluginResource('db'); 

    $db = $resource->getDbAdapter(); 

    Zend_Registry::set("db", $db); 
} 

Poi Access che altrove con ...

$dbAdapter = Zend_Registry::get("db"); 

Grazie per l'aiuto e spero che questo aiuta a qualcun altro.

+0

// Mentre nella classe bootstrap, l'accesso alla risorsa corretto è: $ resource = $ this-> getPluginResource ('db'); –

+1

Ho aggiunto la mia risposta, il che rende ancora più semplice! – Andrew

+0

Davvero bello ... grazie per quello :) –

7

tuo manca la cosa migliore :)

Se si utilizzano i modelli Zend_Db_Table (si dovrebbe essere), ecc, allora è possibile impostare un adattatore di default - in questo modo, quando si crea un'istanza di un modello della connessione DB è preso cura off - in questo modo non è davvero necessario salvarlo nel registro o preoccuparsi della connessione prima di eseguire una query attraverso il modello.

faccio salvarlo nel Registro di sistema per un uso successivo, se necessario, anche se - ma posso rimuovere questo

protected function _initDB() 
{ 
    // Check that the config contains the correct database array. 
    if ($this->_config->db) { 

     // Instantiate the DB factory 
     $dbAdapter = Zend_Db::factory($this->_config->db); 

     // Set the DB Table default adaptor for auto connection in the models 
     Zend_Db_Table::setDefaultAdapter($dbAdapter); 

     // Add the DB Adaptor to the registry if we need to call it outside of the modules. 
     Zend_Registry::set('dbAdapter', $dbAdapter); 
    } 
} 
+0

Grazie. L'ho usato con pochi cambiamenti. –

1

Se si sta utilizzando Zend Framework 1.8 solo fare qualcosa di simile nel tuo controller/action:

class CreateorderController extends Zend_Controller_Action 
{ 
    public function testAction() 
    { 
     //more code 
     $users_obj = new Default_Model_Users(); //this would load the model using the Default namespace 
     //more code 
    } 
} 

la mia classe Defaul_Model_Users sarebbe simile a questa:

<?php 
/** 
* application/models/Users.php 
*/ 
class Default_Model_Users extends Zend_Db_Table 
{ 
    protected $_table; 

    public function getTable() 
    { 
     if(null === $this->_table) { 
      $this->_table = new Default_Model_DbTable_Users(); 
     } 
     return $this->_table; 
    } 

    public function fetchAll() 
    { 
     $result = $this->getTable()->fetchAll(); 

     return $result; 
    } 
} 

E la parte del modello che "interagisce" direttamente con le tabelle del database si trova all'interno di directory DBTable sarà simile a questa:

<?php 
/** 
* application/models/DbTable/Users.php 
*/ 
class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract 
{ 
    /** Table name */ 
    protected $_name = 'users'; 

    public function init() 
    { 
     $this->_db->setFetchMode(Zend_Db::FETCH_OBJ); 
    } 
} 

allora avrei la stessa Application.ini generato da Zend Framework con questa piccola aggiunta :

resources.db.adapter    = "PDO_MYSQL" 
resources.db.params.host   = "localhost" 
resources.db.params.dbname   = "mydb" 
resources.db.params.username  = "root" 
resources.db.params.password  = "password" 

E 'così che ho fatto, senza senza dover modificare i file di bootstrap.

1

non volevo usare il Registro di sistema per memorizzare un oggetto che dovrei essere in grado di accedere, così ho fatto un po 'di scavo. Si scopre che il bootstrap è registrato come parametro frontale del regolatore "bootstrap", che è accessibile da qualsiasi controller, come spiegato in questa pagina di manuale per Zend_Application.

Quindi nel tuo classi controller è possibile ottenere l'adattatore db che è stato definito nel file ini in questo modo:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$resource = $bootstrap->getPluginResource('db'); 
$db = $resource->getDbAdapter(); 
4

I miei 2 centesimi ...

Come per afferrare l'adattatore di default DB:

Da Bootstrap:

<?php  
$dbResource = $this->getPluginResource('db'); 
db = $dbResource->getDbAdapter(); 
var_dump($db); 
?> 

da un controller ci sono due metodi:

<?php 
// Method 1 
$bootstrap = $this->getInvokeArg('bootstrap'); 
$dbResource = $bootstrap->getPluginResource('db'); 
$dbAdapter = $dbResource->getDbAdapter(); 
var_dump($dbAdapter); 

// Method 2 
$dbAdapter = Zend_Db_Table::getDefaultAdapter(); 
var_dump($dbAdapter); 
?>