2009-05-28 30 views
37

Ich bin auf der Suche nach einer Referenz auf die wichtigsten Datenbank Adapter in der Registrierung während des Bootstrapping, so dass es an anderer Stelle in meiner Website (speziell die Autorisierung Aktion) verwendet werden kann.Registrierung Zend Datenbank Adapter in der Registrierung

Ich habe einen hässlichen Fix implementiert, wo ich ein Datenbanktabellenobjekt erstelle und die getAdapter() -Methode darauf aufruft und diese durchlasse. Dies ist jedoch ein schlechter Weg, und ich möchte, dass es über die Registrierung verfügbar ist.

Weiß jemand, wie man das macht? Jede Hilfe oder Hinweise in die richtige Richtung sind willkommen!

Prost Stuart

Ps. Ich benutze Zend Framework 1.8.

+0

ich das gleiche Problem gestoßen sind. Die Dokumente erwähnen das Abrufen der Adapter-Instanz: http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.db Aber das scheint nicht zu funktionieren für mich. – jamiei

+0

Ich denke, was das OP bedeutet ist, wie können Sie eine Instanz des Standard-Adapter-Setup mit der config/bootfile Erwähnung in der Dokumentation hier abrufen: http://framework.zend.com/manual/en/zend.application.available- resources.html # zend.application.available-resources.db – jamiei

Antwort

71

Wenn Sie mit Zend Framework 1.8+ und erstellt Ihr Projekt mit dem Befehl Line-Tool, dann ist es so einfach wie die Registrierung Ihrer Datenbankeinstellungen in Ihrer application.ini Konfigurationsdatei.

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 

Wenn Ihre Datenbankeinstellungen von resources.db voraus sind, werden Sie nicht einmal brauchen nichts in Ihrem Bootstrap.php Datei zu tun, weil sie es für Sie tun. Durch Festlegen der isDefaultTableAdapter-Einstellung auf true können Sie außerdem eine Instanz Ihres Datenbankadapters überall in Ihrer Anwendung abrufen.

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

DANKE ... Warum zum Teufel die ZF Docs darauf bestehen, '$ dbAdapter' immer mit etwas merkwürdigem SQLite aus dem Speicher-Setup zu referenzieren.' GetDefaultAdapter() 'sollte der Standard sein, um konsistent auf den aktuellen' $ dbAdapter' zu verweisen, in den ganzen Dokumenten. Bajeezus, SO versagt mich nie. –

+1

haha, ich stimme zu! froh, dass ich helfen konnte – Andrew

1

Überprüfen Sie die Zend-Dokumentation unter: 15.5.3.3. Speichern einer Datenbank-Adapter in der Registry

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')); 

etwas wie das Sie suchen?

Edit:
Ihre Konfiguration aus einer INI-Datei zu laden, verwenden Sie:
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

Das ist, was ich in docs und anderen Seiten gesehen habe, aber vermutlich die $ options var enthält Benutzernamen, Passwort, dbName usw. Aber in meiner Situation sind diese in der Anwendung gespeichert. Ini-Datei. Gibt es eine Möglichkeit, diese Datei zum Füllen der Optionen zu verwenden? Danke für die schnelle Antwort! – Stuart

+0

Ja, Sie können parse_ini_file verwenden. check my edit – Silfverstrom

+0

Nein. Dies ist Code-Wiederholung. Was er damit meint, ist, wie Sie eine Instanz des Standardadapters abrufen können, ohne die Konfigurationsdatei erneut zu lesen (was in der Bootstrap-Klasse automatisch gemacht wurde). – jamiei

1

Ich habe eine Methode in meinem Bootstrap den Adapter an der Registrierung hinzuzufügen. Ich würde eine sauberere Lösung bevorzugen, aber es funktioniert:

protected function _initRegistry(){ 

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

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

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

Hier ist, was ich tue:

Im Inneren des Bootstrap:

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

Im Inneren des 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'); 
    } 
} 

Und schließlich sieht meine Konfigurationsdatei so aus:

[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 = 

Werfen Sie einen Blick auf:

+1

Das ist * nicht * der richtige Weg, Dinge zu tun! Es ist nicht notwendig, die Konfiguration selbst im Bootstrap zu laden, Zend_Application erledigt dies automatisch. Darüber hinaus verfügt es über eine Ressource zum Initialisieren der Datenbank. Geben Sie einfach die Datenbank in Ihrer Anwendung an, wie in http://framework.zend.com/manual/de/zend.application.available-resources.html#zend.application.available-resources.db beschrieben, und die Datenbank wird automatisch initialisiert –

12

Danke für die Antworten. Ich habe mich entschieden, die akzeptierte Antwort zu ändern und die Lösung zu posten, die ich schließlich benutzt habe - was am Ende wahnsinnig einfach ist !!

Diese im Grunde basiert auf Kommentar des Dcaunt ...

In der Bootstrap-Klasse ..

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

    $db = $resource->getDbAdapter(); 

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

zugreifen Dann, dass an anderer Stelle mit ...

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

Danke für die Hilfe und hoffentlich hilft das jemand anderem.

+0

// Während der Bootstrap-Klasse ist der korrekte Ressourcenzugriff: $ resource = $ this-> getPluginResource ('db'); –

+1

Ich habe meine Antwort hinzugefügt, die es noch einfacher macht! – Andrew

+0

Wirklich schön ... danke dafür :) –

7

Ihr das Beste, was fehlt :)

Wenn Sie die Zend_Db_Table Modelle verwenden usw. (Sie sollten), dann können Sie einen Standard-Adapter einrichten - auf diese Weise, wenn Sie ein Modell der DB-Verbindung instanziiert es aus betreut - Auf diese Weise müssen Sie es nicht wirklich in der Registrierung speichern oder die Verbindung stören, bevor Sie eine Abfrage durch das Modell ausführen.

Ich mache es in der Registrierung speichern für eine spätere Verwendung benötigt, wenn aber - aber ich kann dieses

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

Danke. Ich habe es mit wenig Veränderung benutzt. –

1

entfernen Wenn Sie Zend Framework verwenden 1.8 nur etwas tun, wie dies in dem Controller/Aktion:

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

Meine Defaul_Model_Users Klasse würde wie folgt aussehen:

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

Dann würde ich die gleiche application.ini erzeugt durch Zend Framework mit diesem kleinen Zusatz: 10 Und der Teil des Modells, die direkt mit den Datenbanktabellen „interagiert“ innerhalb DbTable Verzeichnisses wird wie folgt aussehen gefunden :

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" 

das ist, wie ich ohne die Bootstrap-Dateien zu ändern, ohne tat.

1

Ich wollte die Registrierung nicht verwenden, um ein Objekt zu speichern, auf das ich zugreifen könnte, also habe ich ein wenig gegraben. Es stellt sich heraus, dass der Bootstrap als der vordere Controller-Parameter "bootstrap" registriert ist, auf den von jedem Ihrer Controller zugegriffen werden kann, wie in dieser Handbuchseite für Zend_Application erklärt.

Also in Ihren Controller-Klassen können Sie den db-Adapter bekommen, die in Ihrer INI-Datei wie folgt definiert wurde:

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

Meine 2 Cent ...

Wie wird die Standard DB Adapter greifen:

Von Bootstrap:

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

von einem Controller gibt es zwei Methoden:

<?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); 
?> 
Verwandte Themen