Как мне получить базу данных Zend_Application в класс модели? - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть приложение Zend_Framework, в котором есть целая куча классов моделей.

Мне нужны эти классы моделей для доступа к базе данных приложения (естественно).

В настоящее время я поместил это в свой index.php:

Zend_Registry::set('db',
        $application->bootstrap()->getBootstrap()
        ->getPluginResource('db')->getDbAdapter());

А затем $db = Zend_Registry::get('db'); в каждом из моих классов моделей, которым требуется база данных.

Но это похоже на ужасный ужасный хак. Я что-то здесь упускаю?

Ответы [ 4 ]

3 голосов
/ 13 апреля 2010

Пример настройки SQLITE в вашем application.ini. Вы также можете настроить MySQL или другие.

resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook.db"

После загрузки БД в приложение вы можете расширить Zend_Db_Table_Abstract

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    /** Table name */ 
    protected $_name    = 'guestbook';

    public function init() {
        $db = $this->getAdapter();

    }
}

Вы можете использовать методы Zend ...

        $select = $db->select()
         ->from(array('p' => 'products'),
                array('product_id', 'product_name'))
         ->join(array('l' => 'line_items'),
                'p.product_id = l.product_id');

Или вы можете сделать прямой sql ...

$sql = 'SELECT * FROM table1 t1 JOIN table2 t2 ON (t1.id = t2.id) JOIN table3 t3 ON (t3.id = t2.id);
$db->query($sql)->fetchAll(); 

Все это можно сделать в любом классе модели, который расширяет Zend_Db_Table_Abstract

2 голосов
/ 13 апреля 2010

Нет ничего плохого в том, чтобы прикрепить адаптер базы данных по умолчанию в записи реестра.

Нет встроенного подключения к базе данных «по умолчанию», поскольку не каждое приложение использует базу данных.

Одно улучшение (по мне) по сравнению с вашим методом:

Вместо того, чтобы настраивать файл в index.php, я обычно инициализирую адаптер и вставляю в реестр метод initDb () в Bootstrap.php (созданный генерацией проекта из командной строки). Таким образом, он может управляться механизмом начальной загрузки Zend.

1 голос
/ 13 апреля 2010

Это не ужасный взлом. В этом случае Registry служит в качестве локатора службы. Это намерение шаблона. Альтернативой может быть использование контейнера для инъекций зависимостей .

Однако, поскольку вы, скорее всего, просто делаете Zend_Registry::get('db') внутри своей модели, вы создаете зависимость от класса Registry, что делает ваш код несколько сложным для тестирования. Вы не можете просто посмеяться над классом реестра в ваших UnitTests. Было бы разумнее внедрить экземпляр реестра с фабрики моделей.

Смотрите этот вопрос по теме:

1 голос
/ 13 апреля 2010

EDIT

Поскольку вы не хотите реализовывать Zend_Db_Table_Abstract, вы можете расширить текущую модель до __construct, предварительно отформатировав Zend_Registry::get('db'), а затем сохранить ее до $this->db.

Тогда во всех ваших моделях вам просто нужно написать $ this-> db.

Оригинальный ответ

Если под моделью вы подразумеваете экземпляр Zend_Db_Table_Abstract, то вы хотите это в своем файле application.ini. Консультируйтесь с http://framework.zend.com/manual/en/zend.application.available-resources.html для объяснения того, как использовать ресурс db и другие его варианты.

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "webuser"
resources.db.params.password = "XXXXXXX"
resources.db.params.dbname = "test"
resources.db.isDefaultTableAdapter = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...