我有一个Zend_Framework应用程序,它有一大堆模型类。
我需要这些模型类才能访问应用程序的数据库(当然)。
目前我把它放在我的index.php中:
Zend_Registry::set('db',
$application->bootstrap()->getBootstrap()
->getPluginResource('db')->getDbAdapter());
然后在每个需要数据库的模型类中$db = Zend_Registry::get('db');
。
但这似乎是一个可怕的可怕黑客。我错过了一些基本的东西吗?
答案 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中模拟注册表类。从模型工厂注入注册表实例会更聪明。
请参阅此相关问题: