我正在学习Zend Framework,我正在努力了解如何建立与数据库的连接。
我了解一些方法,但我想了解zend教程中的快速启动应用程序是如何将application.ini文件中的数据库参数传递到代码中的。有问题的页面在这里:http://framework.zend.com/manual/en/learning.quickstart.create-model.html.
我看不到获取参数的显式调用,我认为这与下面的类的工作方式有关。
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
有人能告诉我这个应用程序是如何从application.ini文件中获取数据库的详细信息的吗?
非常感谢
使用Zend_Application_Resource_DB插件设置DB适配器。
引导程序使用应用程序ini文件db部分的设置调用插件。它创建一个适配器,然后使用静态setDefaultAdapter方法将其设置为Zend_Db_Table的默认适配器。
然后,它被用作所有表(扩展Zend_Db_Table_Abstract)的适配器,除非您将不同的适配器传递给它们的构造函数。
这是资源插件的文档。
简单的答案是,它发生在引导过程中。详细的答案是,Zend_Config对象是为每个zApplication.ini节创建的,从application.ini创建的Zend_Config用于配置特定于您的设置的DBAdapter,Zend_DB_Table_Abstract用于查询其后备存储。长长的答案是…阅读代码和文档。。。
根据我的理解,为了那些可能陷入同一问题的人的利益,封装响应:
默认情况下,Zend_Application_Bootstrap类会将前缀为resources.db的任何内容加载为与Zend_db相关的资源。
下面的代码创建了一个类,用于命名数据库中的表。
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
protected $_name = 'guestbook';
}
以下代码创建了上面的一个实例,这就是应用程序"知道"存在Zend_Db_Table类型对象的方式:
class Application_Model_GuestbookMapper
{
protected $_dbTable;
public function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable(); // this line creates an object of type
// 'Application_Model_DbTable_Guestbook'...
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
$this->_dbTable = $dbTable;
return $this;
}
public function getDbTable()
{
if (null === $this->_dbTable) {
$this->setDbTable('Application_Model_DbTable_Guestbook'); // ...from this line
}
return $this->_dbTable;
}
而且。。哇!