Регистрация адаптера базы данных зенда в реестре

Эти ключевые слова используются для разных целей.

Ключевое слово using делает имя из пространства имен доступным для использования в текущем декларативном регионе. Это в основном для удобства, чтобы вам не приходилось постоянно использовать полное имя. Эта страница объясняет это в некоторых деталях.

Инструкция #include является директивой препроцессора, и она указывает препроцессору обрабатывать содержимое указанного файла так, как если бы это содержимое появилось в исходной программе в тот момент, когда появляется директива. То есть вы можете думать об этом заявлении как о копировании включенного файла в текущий. Затем компилятор компилирует весь файл так, как будто вы записали весь код в один большой файл.

37
задан David Snabel-Caunt 28 May 2009 в 15:55
поделиться

9 ответов

Если вы используете Zend Framework 1.8+ и создали свой проект с помощью инструмента командной строки, то это так же просто, как зарегистрировать настройки вашей базы данных в вашем application.ini config.

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

Если параметрам вашей базы данных предшествует resources.db , вам даже не нужно будет ничего делать в вашем файле Bootstrap.php , потому что он сделает это за вас . Кроме того, установив для параметра isDefaultTableAdapter значение true , вы можете получить экземпляр адаптера базы данных в любом месте приложения.

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
71
ответ дан 27 November 2019 в 04:16
поделиться

Ознакомьтесь с zend-документацией по адресу: 15.5.3.3. Сохранение адаптера базы данных в реестре

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

что-то вроде того, что вы ищете?

Изменить:
] чтобы загрузить конфигурацию из ini-файла, используйте:
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
ответ дан 27 November 2019 в 04:16
поделиться

Вы упускаете самое лучшее: )

Если вы используете модели Zend_Db_Table (должны быть) и т. Д., То вы можете настроить адаптер по умолчанию - таким образом, когда вы создаете экземпляр модели, соединение с БД было отключено - таким образом вам действительно не нужно сохранять его в реестр или беспокоиться о соединении перед выполнением запроса через модель.

Я сохраняю его в реестре для дальнейшего использования, если это необходимо, но я могу удалить это

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
ответ дан 27 November 2019 в 04:16
поделиться

Спасибо за ответы. Я решил изменить принятый ответ и опубликовать решение, которое я наконец использовал, - которое в итоге безумно просто !!

Это в основном основано на Dcaunt '

12
ответ дан 27 November 2019 в 04:16
поделиться

Вот что я делаю:

Внутри начальной загрузки:

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

Внутри инициализатора:

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

И, наконец, мой файл конфигурации выглядит так:

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

Взгляните на:

1
ответ дан 27 November 2019 в 04:16
поделиться

У меня есть метод в моем начальной загрузке, чтобы добавить адаптер в реестр. Я бы предпочел более чистое решение, но оно работает:

protected function _initRegistry(){

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

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

    Zend_Registry::set('db', $db);
}
1
ответ дан 27 November 2019 в 04:16
поделиться

Если вы используете Zend Framework 1.8, просто сделайте что-нибудь вроде этого в вашем контроллере / действии:

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

Мой класс Defaul_Model_Users будет выглядеть примерно так:

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

И часть модели, которая "взаимодействует" напрямую с таблицами базы данных, находится внутри каталога DbTable и будет выглядеть так:

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

Тогда у меня будет тот же файл application.ini, сгенерированный Zend Framework с этим небольшим дополнением:

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"

Вот как я обошелся, не имея для изменения файлов начальной загрузки.

1
ответ дан 27 November 2019 в 04:16
поделиться

Я не хотел использовать реестр для хранения объекта, к которому у меня должен быть доступ, поэтому я немного покопался. Оказывается, что начальная загрузка регистрируется как параметр фронтального контроллера "bootstrap", который доступен с любого из ваших контроллеров, как описано на этой странице руководства для Zend_Application .

Таким образом, в классах вашего контроллера вы можете получите адаптер db, который был определен в вашем ini-файле следующим образом:

$bootstrap = $this->getInvokeArg('bootstrap');
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();
1
ответ дан 27 November 2019 в 04:16
поделиться

Мои 2 цента...

Как получить адаптер БД по умолчанию:

Из Bootstrap:

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

Из контроллера есть два метода:

<?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
ответ дан 27 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: