2009-11-14 22 views
6

假设您正在密切关注ZendApplication的约定,应该在哪里设置数据库处理程序以供应用程序开发人员访问?什么是用数据库处理程序提供Zend应用程序的“正确”方法

我知道如何设置一个​​适配器。我想知道的是,在Zend Framework的背景下,开发人员应该如何实例化他们的DB处理程序,这样他们就不必担心跨请求的多个实例化,每次都提供凭据等。

For例如,当开发人员使用Code Igniter并需要运行任意查询时,控制器上有一个数据库处理程序。

$this->db->query(.... 

什么是该公约的等价物?清楚的是,我可以用六种方法来使用Zend Framework提供的工具来完成这个任务。我一直在寻找的是在一般情况下,Zend Framework如何让你做到这一点。

回答

18

的想法是,你的引导读取配置文件,并声明配置条目以描述您想要创建的数据库适配器:

[bootstrap] 
resources.db.adapter = Pdo_Mysql 
resources.db.params.dbname = "mydatabase" 
resources.db.params.username = "webuser" 
resources.db.params.password = "XXXX" 
resources.db.isDefaultTableAdapter = true 

如果你使用了正确约定以下设定键,这个自动信号Bootstrap基类创建并初始化一个Zend_Application_Resource_Db对象,并将其存储在bootstrap resource registry中。

在控制器的后面,您可以访问资源注册表。 说明:我在测试一段代码后编辑了这段代码。

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $bootstrap = $this->getInvokeArg("bootstrap"); 
     if ($bootstrap->hasPluginResource("db")) { 
      $dbResource = $bootstrap->getPluginResource("db"); 
      $db = $dbResource->getDbAdapter(); 
     } 
    } 
} 

或者,你可以在你的引导类编写自定义的init方法,来保存对象在默认合适的词汇:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initDb() 
    { 
    if ($this->hasPluginResource("db")) { 
     $dbResource = $this->getPluginResource("db"); 
     $db = $dbResource->getDbAdapter(); 
     Zend_Registry::set("db", $db); 
    } 
    } 
} 

现在,您可以访问数据库对象一步到位,而不是三个:

class SomeController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $db = Zend_Registry::get("db"); 
    } 
} 

就我个人而言,我会使用第二种技术,因为那时我只能在我的引导程序中访问资源注册表一次。在第一个例子中,我将不得不将相同的代码块复制到我的所有控制器中。

+1

我投票否决了因为把db放在注册表中是一个不好的做法。您应该扩展Zend_Controller_Action并从引导中获取db作为受保护的属性。 – venimus 2012-06-18 09:33:12

相关问题