Регистрация адаптера базы данных Zend в реестре
Я ищу, чтобы зарегистрировать ссылку на основной адаптер базы данных в реестре во время Bootstrapping, чтобы его можно было использовать в другом месте на моем сайте (в частности, действие авторизации).
Я применил уродливое исправление, когда создаю объект таблицы базы данных и вызываю метод getAdapter() и передаю его. Однако это плохой способ сделать это, и я хотел бы, чтобы он был доступен через реестр.
Кто-нибудь знает, как это сделать? Любая помощь или указатели в правильном направлении приветствуются!
Приветствия
Стюарт
Ps. Im использует Zend Framework 1.8.
Ответы
Ответ 1
Если вы используете Zend Framework 1.8+ и создали свой проект с помощью инструмента командной строки, то это так же просто, как регистрация настроек вашей базы данных в конфигурационном файле 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
Если вашим настройкам базы данных предшествует resources.db
, вам даже не нужно ничего делать в вашем файле Bootstrap.php
, потому что он сделает это за вас. Кроме того, установив для параметра isDefaultTableAdapter
значение true
, вы можете получить экземпляр вашего адаптера базы данных в любом месте приложения.
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
Ответ 2
Спасибо за ответы. Ive решил изменить принятый ответ и опубликовать решение, которое я наконец использовал, - что в конце концов безумно просто!
Это в основном основано на комментарии Dcaunt...
В классе bootstrap..
protected function _initDb()
{
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();
Zend_Registry::set("db", $db);
}
Затем доступ к этому в другом месте с...
$dbAdapter = Zend_Registry::get("db");
Спасибо за помощь и, надеюсь, это поможет кому-то другому.
Ответ 3
Ваше пропущенное лучшее:)
Если вы используете модели 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);
}
}
Ответ 4
Мои 2 цента...
Как захватить адаптер DB по умолчанию:
Из бутстрапа:
<?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);
?>
Ответ 5
Проверьте документацию 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);
Ответ 6
У меня есть метод в моем загрузочном блоке, чтобы добавить адаптер в реестр. Я бы предпочел более чистое решение, но оно работает:
protected function _initRegistry(){
$this->bootstrap('db');
$db = $this->getResource('db');
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Registry::set('db', $db);
}
Ответ 7
Вот что я делаю:
Внутри бутстрапа:
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 =
Взгляните на:
Ответ 8
Если вы используете 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
}
}
Класс My 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"
Вот как я обошелся без изменения файлов начальной загрузки.
Ответ 9
Я не хотел использовать реестр для хранения объекта, к которому я должен иметь доступ, поэтому я немного поработал. Оказывается, что bootstrap зарегистрирован как параметр переднего контроллера "bootstrap", доступный с любого из ваших контроллеров, как описано на этой странице руководства для Zend_Application.
Итак, в классах контроллеров вы можете получить адаптер db, который был определен в вашем ini файле следующим образом:
$bootstrap = $this->getInvokeArg('bootstrap');
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();