繁体   English   中英

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

[英]IsZend Db Adapter registered in Registry when using a default recource?

在ini文件中进行配置时,Zend Framework中有现成的资源

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

引导程序设置数据库适配器,只是很好奇引导程序也将数据库适配器设置为注册表?

据我所知,默认情况下,Zend_Registry不会放入任何内容。 您必须自己使用Bootstraps _init ...方法之一来执行此操作。

ZF Zend应用手册

资源注册表

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

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

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

请注意,它们还声明:

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

我已经检查Zend_Application_Bootstrap_BootstrapAbstract源代码,并且该容器确实是一个新的Zend_Registry实例。 就像它们在手册中指出的那样,这是一个本地注册表,而不是通过setInstance()设置为全局实例。 因此,如果您引用的是通过getInstance()获得的全局Zend_Registry ,那么答案是否定的。 数据库适配器将不在其中。

注意: 我不确定,数据库适配器甚至存储在本地注册表对象中,因为我找不到放置在那里的插件的任何引用。 registerPluginResource()似乎将资源放入数组中。 不管您的问题如何。 答案是否定的。

您可以自己在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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM