2010-04-13 44 views
0

我有一个Zend_Framework应用程序,它有一大堆模型类。如何将Zend_Application的数据库放入模型类中?

我需要这些模型类能够访问应用程序的数据库(自然地)。在每个需要的数据库我的模型类的

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

然后$db = Zend_Registry::get('db');

目前我已经把这个在我的index.php。

但是,这似乎是一个可怕的可怕的黑客攻击。我在这里错过了什么基础?

回答

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任何模型类完成

+0

是的,我可以设置应用程序设置数据库。但是没有明显的方式将数据库对象放入模型中。 – 2010-04-13 04:10:13

+0

@比利 - 再看看。 – 2010-04-13 04:50:02

+0

我不想使用表格数据网关。很难表示常规需要连接5或6个表格的数据集。 – 2010-04-13 06:25:31

1

编辑

既然你不想实现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

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 
+0

我不想使用表格数据网关。 – 2010-04-13 06:23:28

+0

+1减少代码使用建议。 – 2010-04-13 14:39:48

2

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

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

(据我)在你的方法的一个改进:

的index.php中进行设置了。相反,我通常初始化适配,并坚持在注册表中bootstrap.php中的initdb的()方法(如由命令行项目生成创建的)。这样就可以通过Zend的bootstrap机制来管理它。

1

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

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

请参阅此相关的问题:

相关问题