Zend应用中获得默认的Zend_Db_Adapter
在使用Zend_Auth_Adapter_DbTable时,构造函数必须传入类型为Zend_Db_Adapter对象的dbAdapter参数,问题就在于如何创建这个Zend_Db_Adapter对象。
最原始的方法,就是在需要使用该对象时直接使用Zend_Db::factory()方法创建一个,然后使用之。
学习Rob Allen的”Getting Started with Zend_Auth”(这个教程还停留在ZendFramework 1.0.1的版本状态下,很多编程方式还不太合适)过程中,发现他使用的方法是在index.php即程序入口中通过Zend_Db::factory()方法创建db对象,然后通过Zend_Registry将其存起来;之后在需要使用db对象的地方,再通过Zend_Registry读出来。
这个方法是好一些了,但是在index.php里创建对象,好像不符合Zend_Application的习惯,按道理index.php基本上都可以不用改了的。后来看到在www.phpchina.com/bbs上面有人提出来在Bootstrap里面创建_initDB方法(事实上用这个方法名,会干扰Zend_Application_Resource_Db的执行),在方法里执行:
$resource = $this->getPluginResource(’db’);
$db = $resource->getDbAdapter();
Zend_Registry::set(’db’, $db);
这样就可以直接使用config中设定的数据库信息了,而不用再重新读取config,而保存读取db对象,还是要靠Zend_Registry。
似乎没有找到更好的方案了,但是我还是有些不满足。因为在使用Zend_Db_Table的时候,我们是不需要指定db对象的,也就是说config中的数据库信息已经被Zend_Application自动调用并创建db对象了,关键问题是这个db对象是如何存放、读取的。
考虑到在Bootstrap中创建_initDB方法时,原先的数据库读取都出问题了,而这时受到干扰不能执行的是Zend_Application_Resource_Db。说明Zend_Db_Table相关的Zend_Db_Adapter操作就在这个Resource_Db里面。查看其源代码,发现确实如此:其getDbAdapter()方法通过Zend_Db::factory()创建db对象,然后通过Zend_Db_Table::setDefaultAdapter()方法将db对象存到Zend_Db_Table的静态属性中去了。也正因如此,所有继承Zend_Db_Table的类都可以不用指定db对象(因为它已经存在了)。
最后,看到Zend_Db_Table还有一个getDefaultAdapter()的静态方法,也就是说通过这个方法就可以取得db对象了。
因此,Zend应用中,任何非Zend_Db_Table类中如果需要使用到config中指定的Zend_Db_Adapter对象,只需要下面一行代码:
Zend_Db_Table::getDefaultAdapter()
不再需要factory、resource,也不需要Zend_Registry了。
