【问题标题】:What is the "right" Way to Provide a Zend Application With a Database Handler为 Zend 应用程序提供数据库处理程序的“正确”方式是什么
【发布时间】:2011-04-06 00:57:18
【问题描述】:

假设您严格遵守 ZendApplication 的约定,您应该在哪里设置数据库处理程序以供应用程序开发人员访问?

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

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

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

这个约定的 Zend 等价物是什么?为了清楚起见,我可以想出六种方法来使用 Zend 框架提供的工具来完成此任务。我正在寻找的是 Zend 框架在一般情况下希望您如何执行此操作。

【问题讨论】:

    标签: php database zend-framework


    【解决方案1】:

    这个想法是您的 Bootstrap 读取配置文件并声明配置条目来描述您要创建的数据库适配器:

    [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 中。

    稍后在您的 Controller 中,您可以访问资源注册表。 注意:我在对这段代码进行了更多测试后对其进行了编辑。

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

    或者,您可以在 Bootstrap 类中编写自定义 init 方法,以将对象保存在默认的 Zend_Registry 中:

    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);
        }
      }
    }
    

    现在您可以一步而不是三步访问您的 db 对象:

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

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

    【讨论】:

    • 我投了反对票,因为将 db 放入注册表是一种不好的做法。您应该扩展 Zend_Controller_Action 并从引导程序中获取 db 作为受保护的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2018-07-12
    • 2018-10-15
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多