使用默认资源时,Zend Db适配器是否在注册表中注册?

时间:2010-03-15 05:57:47

标签: php zend-framework

Zend Framework中有一个开箱即用的资源, 何时在ini文件中配置

resource.db.user ="xxxx"...

引导程序设置db适配器,只是好奇引导程序是否也将db adapter设置为注册表,或者不是?

3 个答案:

答案 0 :(得分:1)

据我所知,默认情况下没有任何内容放入Zend_Registry。你必须自己在一个Bootstraps _init ...方法中做到这一点。

答案 1 :(得分:1)

来自ZF Manual on Zend Application

  

资源注册表

     

许多(如果不是全部)资源方法或插件将初始化对象,并且在许多情况下,应用程序中的其他位置将需要这些对象。你怎么能访问它们?

     

Zend_Application_Bootstrap_BootstrapAbstract为这些对象提供本地注册表。要将对象存储在其中,只需从资源中返回它们即可。

     

为了获得最大的灵活性,此注册表在内部称为“容器”;它唯一的要求是它是一个对象。然后将资源注册为以资源名称命名的属性。默认情况下,使用Zend_Registry的实例,但您也可以指定任何其他对象。

请注意,他们还声明:

  

请注意,注册表和容器不是全局的。这意味着您需要访问引导程序才能获取资源。

我已经使用sourcecode for Zend_Application_Bootstrap_BootstrapAbstract进行了检查,容器确实是一个新的Zend_Registry实例。就像他们在手册中说的那样,这是一个本地注册表,而不是通过setInstance()设置为全局实例。因此,如果您使用Zend_Registry引用全局getInstance(),那么答案就是否定。数据库适配器不在那里。

注意:我不完全确定,db适配器甚至存储在本地注册表对象中,因为我找不到任何插件放在那里的插件。 registerPluginResource()似乎将资源放在一个数组中。但是对你的问题无关紧要。答案仍然没有。

答案 2 :(得分:1)

您可以在Bootstrap类中自行将其添加到注册表中:

protected function _initAddDbToRegistry()
{
    $this->bootstrap('db');
    $db = $this->getResource('db');

    Zend_Registry::set('db', $db);
}

但是,如果你只想获得Db适配器,那么有很多选择:

首先,Zend_Application_Resource_Db将数据库适配器设置为Zend_Db_Table的默认值,因此您可以使用以下命令在应用程序的任何位置检索它:

$db = Zend_Db_Table::getDefaultAdapter();

或者,您可以通过前端控制器进行检索。在控制器操作中,您可以使用:

$bootstrap = $this->getInvokeArg('bootstrap');
$db = $bootstrap->->getResource('db');

或在整个申请过程中,这将有效:

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
db = $bootstrap->->getResource('db');