php - zend 模块特定配置的问题

标签 php zend-framework

我正在使用 zend 框架构建 REST 网络服务,我正在使用模块来分隔我的 api 版本。

现在,我想为我的每个模块(v1 和 v2)创建一个单独的配置文件,主要用于指定单独的数据库连接。

我的目录结构是这样的:

- application
      - modules
            - v1
                  - controllers
                  - models
                  - views
                  - configs
                    - module.ini         
            - v2
                  - controllers
                  - models
                  - views  
                  - configs
                    - module.ini
      - configs
            - application.xml   
- library

我已经在 application/configs 中的“application.ini”中提到了数据库连接。我读了 here 关于模块特定的混淆并尝试过。

我从 application.ini 中删除了这些数据库参数并将其放入 module.ini 中:

[production]
resources.db.adapter = PDO_MYSQL
resources.db.params.host = 127.0.0.1
resources.db.params.username = myuser   
resources.db.params.password = mypwd
resources.db.params.dbname = my_db
resources.db.params.profiler.enabled = "true"
resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug"

.....

但是当我在我的模块的 Controller 中访问数据库时,我得到一个错误提示“找不到适配器...”。请帮助...

最佳答案

在 Bootstrap 中,您可以设置数据库连接:

protected function _initDb () {
    $config['my_db1'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db1.ini');
    $config['my_db2'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db2.ini');

    $my_db1 = new Plugin_Replication($config['my_db1']->toArray());
    $my_db1->query("SET CHARACTER SET utf8;");

    $my_db2 = new Plugin_Replication($config['my_db2']->toArray());
    $my_db2->query("SET CHARACTER SET utf8;");

    Zend_Db_Table::setDefaultAdapter($dmy_db1);
    Zend_Registry::set('my_db1', $my_db1);
    Zend_Registry::set('my_db2', $my_db2);
}

在我的案例中,每个连接都在单独的 .ini 文件中指定。我发现这非常直观地组织起来。数据库 ini 文件不需要 resources.db.whatever 名称。我的是这样的:

[Master]
host = "xxx"
username = "xxx"
password = "xxx"
dbname = "xxx"
charset = utf8

[Slaves]
first.host = "xxx"
first.username = "xxx"
first.password = "xxx"
first.dbname = "xxx"
first.charset = utf8

second.host = "xxx"
second.username = "xxx"
second.password = "xxx"
second.dbname = "xxx"
second.charset = utf8

一旦您像这样设置了多个数据库,在创建模型时(在您希望的任何模块中),您可以告知 ZF 您想要使用的数据库:

protected function _setupDatabaseAdapter() {
    $this->_db = Zend_Registry::get('my_db1');
}

这将是您的默认适配器。如果您需要在同一查询中使用两个数据库,请使用以下命令启动模型的功能:

public function myAwesomeSqlQuery () {
    $db1 = $this->getAdapter()->getConfig(); //default adapter
    $db2 = Zend_Registry::get('my_db2')->getConfig(); //additional adapter

现在,您可以这样使用两个数据库编写查询:

$sql = $this
    ->select()
    ->setIntegrityCheck(false)
    ->from(array('col1' => $db1['dbname'].'.some_column'))
    ->join(array('col2' => $db2['dbname'].'.some_other_column')),'col1.id = col2.id')
;

正如我在评论中所建议的,您还可以使用特定于模块的 Bootstrap 。结构将是这样的:

/application/
  -- /modules/
    -- /v1/
        -- /controllers/
        -- /views/
        -- /Bootstrap.php
    -- /v2/
        -- /controllers/
        -- /views/
        -- /Bootstrap.php

特定于模块的 Bootstrap 的构造与任何其他 Bootstrap 非常相似,但它们会影响相关模块。类名通常以模块名称为前缀,例如:

<?php
class V1_Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    ...
}

我通常尽量不使用特定于模块的 Bootstrap ,因为它们都是随每个请求启动的(Zend Framework 2 应该会纠正此问题),运行当前模块不需要的功能。不管怎样,我在我的一个模块中发现了一个特定于模块的 Bootstrap ,其中包含如下内容:

class MyModule_Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    protected function _initLoggers () {
        $my_db1 = Zend_Registry::get('my_db1');
        $my_db2 = Zend_Registry::get('my_db2');
        $my_db1->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true);
        $my_db2->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true);

        $auth = Zend_Auth::getInstance();
        $columnMapping = array('priority' => 'priority' , 'message' => 'message' , 'timestamp' => 'timestamp' , 'username' => 'username');
        $logger = new Zend_Log(new Zend_Log_Writer_Db($my_db1, 'logs', $columnMapping));
        print_r($auth->getIdentity());
        if ($auth->hasIdentity())
            $logger->setEventItem('username', $auth->getIdentity()->username);
        Zend_Registry::set('logger', $logger);
    }

差不多就这些了。希望对您有所帮助。

关于php - zend 模块特定配置的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190911/

相关文章:

php - Zend - 如何在 session 表上启用缓存(元数据)?

zend-framework - 如何隐藏 zend Framework2 已弃用消息

java - Zend Server CE 和 BIRT 与 Javabridge 集成

JavaScript Ajax 到 PHP,然后返回 Javascript

php - 如何在 php 中制作一个表单,允许用户在需要时添加其他表单字段?

php - Zend 框架 : How to detect environment(dev/prod) in code

php - Zend Framework 清除缓存

php - 更改php中分页的目标页面

php - 作为报价收到的 JSON(带有 ""标记)

php - 由于 WordPress 无法访问我的文件夹