Rejestracja adaptera bazy danych Zend w rejestrze

Chcę zarejestrować odniesienie do głównego adaptera bazy danych w rejestrze podczas Bootstrapowania, aby można go było użyć w innym miejscu na mojej stronie (konkretnie w akcji autoryzacji).

Zaimplementowałem brzydką poprawkę, w której tworzę obiekt tabeli bazy danych i wywołuję na nim metodę getAdapter () i przechodzę przez nią. Jest to jednak zły sposób robienia tego i chciałbym, aby było dostępne za pośrednictwem rejestru.

Czy ktoś wie jak to zrobić? Każda pomoc lub wskazówki w właściwy kierunek jest doceniany!

Cheers Stuart

Ps. Im using Zend Framework 1.8.

Author: David Snabel-Caunt, 2009-05-28

9 answers

Jeśli używasz Zend Framework 1.8+ i tworzysz swój projekt za pomocą narzędzia wiersza poleceń, to jest to tak proste, jak rejestracja ustawień bazy danych w pliku konfiguracyjnym 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

Jeśli ustawienia bazy danych są poprzedzone przez resources.db, nie będziesz musiał nic robić w swoim pliku Bootstrap.php, ponieważ zrobi to za Ciebie. Ponadto, poprzez ustawienie isDefaultTableAdapter na true, można uzyskać instancję adaptera bazy danych w dowolnym miejscu w aplikacji.

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
 71
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-24 00:09:56

Dzięki za odpowiedzi. Postanowiłem zmienić zaakceptowaną odpowiedź i opublikować rozwiązanie, z którego w końcu skorzystałem-co jest szalenie proste!!

Jest to w zasadzie oparte na komentarzu Dcaunta...

W klasie bootstrap..

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

    $db = $resource->getDbAdapter();

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

Następnie uzyskać dostęp do tego gdzie indziej z...

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

Dzięki za pomoc i mam nadzieję, że to pomoże komuś innemu.

 12
Author: Stuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-13 07:36:35

Twoje zaginięcie najlepsze:)

Jeśli używasz modeli Zend_Db_Table (powinieneś być) itp., Możesz skonfigurować domyślną adapter - w ten sposób, gdy tworzysz instancję modelu, połączenie DB zostało wyłączone - w ten sposób naprawdę nie musisz go zapisywać w rejestrze lub martwić się o połączenie przed uruchomieniem zapytania przez model.

Zapisuję go w Rejestrze do późniejszego wykorzystania w razie potrzeby - ale mogę to usunąć

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);
    }
}
 7
Author: Ian Warner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-29 13:21:54

Moje 2 centy...

Jak pobrać domyślny Adapter DB:

From Bootstrap:

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

Z kontrolera są dwie metody:

<?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);
?>
 4
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 16:05:57

Sprawdź zend-documentation na : 15.5.3.3. Przechowywanie adaptera bazy danych w rejestrze

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'));
Czegoś takiego szukasz?

Edit:
aby załadować konfigurację z pliku ini, użyj:
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);
 1
Author: Silfverstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-28 15:36:32

Mam metodę w moim bootstrap, aby dodać adapter do rejestru. Wolałbym czystsze rozwiązanie, ale działa:

protected function _initRegistry(){

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

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

    Zend_Registry::set('db', $db);
}
 1
Author: David Snabel-Caunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-28 15:48:13

Oto co robię:

Wewnątrz bootstrap:

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

Wewnątrz Inicjalizatora:

 /**
 * 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');
    }
}

I na koniec mój plik konfiguracyjny wygląda tak:

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

Spójrz na:

 1
Author: Boris Guéry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-28 15:59:04

Jeśli używasz Zend Framework 1.8 po prostu zrób coś takiego w swoim kontrolerze / akcji:

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

Moja klasa Defaul_Model_Users wyglądałaby mniej więcej tak:

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

A część modelu, która" współdziała " bezpośrednio z tabelami bazy danych znajduje się w katalogu DbTable, będzie wyglądała następująco:

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

Wtedy miałbym taką samą aplikację.ini generowane przez Zend Framework z tym małym dodatkiem:

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"

Tak zrobiłem bez bez konieczności zmiany plików bootstrap.

 1
Author: wenbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-09 06:44:40

Nie chciałem używać rejestru do przechowywania obiektu, do którego powinienem mieć dostęp, więc trochę poszperałem. Okazuje się, że bootstrap jest zarejestrowany jako parametr kontrolera "bootstrap", który jest dostępny z dowolnego kontrolera, jak wyjaśniono na tej stronie podręcznika dla Zend_Application.

Więc w klasach kontrolerów można uzyskać adapter db, który został zdefiniowany w pliku ini w następujący sposób:

$bootstrap = $this->getInvokeArg('bootstrap');
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();
 1
Author: Vishal Parpia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 17:54:26