如何将Zend_Application的数据库放入模型类?

时间:2010-04-13 02:13:38

标签: php zend-framework model

我有一个Zend_Framework应用程序,它有一大堆模型类。

我需要这些模型类才能访问应用程序的数据库(当然)。

目前我把它放在我的index.php中:

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

然后在每个需要数据库的模型类中$db = Zend_Registry::get('db');

但这似乎是一个可怕的可怕黑客。我错过了一些基本的东西吗?

4 个答案:

答案 0 :(得分:3)

在application.ini中设置SQLITE的示例。您也可以设置MySQL或其他。

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

将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

的模型类中完成

答案 1 :(得分:2)

将默认数据库适配器粘贴到注册表项中没有任何问题。

没有内置的“默认”数据库连接,因为并非每个应用程序都使用数据库。

对你的方法有一点改进(据我所知):

我没有在index.php中进行设置,而是通常初始化适配器并在Bootstrap.php中的initDb()方法中保留在注册表中(由命令行项目生成创建)。这样它就可以通过Zend的自举机制来管理。

答案 2 :(得分:1)

修改

由于您不想实施Zend_Db_Table_Abstract,您可以将当前模型扩展到__construct预先形成Zend_Registry::get('db'),然后将其存储到$this->db

然后在你的所有模型中,你只需要编写$ this-> db。

原始答案

如果按型号表示Zend_Db_Table_Abstract的实例,那么您需要在application.ini文件中使用它。有关如何使用db资源及其他选项的说明,请参阅http://framework.zend.com/manual/en/zend.application.available-resources.html

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

答案 3 :(得分:1)

这不是一个可怕的黑客。在这种情况下,Registry充当服务定位器。这是模式的意图。另一种方法是使用Dependency Injection Container

但是,由于您可能只是在模型中执行Zend_Registry::get('db'),因此您正在创建对Registry类的依赖,这会使您的代码难以测试。您不能只在您的UnitTests中模拟注册表类。从模型工厂注入注册表实例会更聪明。

请参阅此相关问题: