如何使用application.ini和user.ini设置Zend_Application

时间:2010-01-10 11:53:24

标签: php zend-framework configuration zend-application

我正在使用Zend_Application,我觉得我在application.ini混合了应用程序和用户配置感觉不对。

我的意思如下。例如,我的应用程序需要名称空间MyApp_中的一些库类。所以在application.ini中我放了autoloaderNamespaces [] =“MyApp_”。这是纯粹的应用程序配置,除了程序员之外没有人会更改这些。另一方面,我在那里放置了一个数据库配置,这是SysAdmin会改变的。

我的想法是我会在application.ini和user.ini之间拆分选项,其中user.ini中的选项优先(因此我可以在application.ini中定义标准值)。

这是个好主意吗?我怎样才能最好地实现这一点?我的想法是

  • 扩展Zend_Application以获取多个配置文件
  • 在我的Bootstrap中创建一个init函数,加载user.ini
  • 解析我的index.php中的配置文件并将它们传递给Zend_Application(听起来很难看)

我该怎么办?我希望有一个“最干净”的解决方案,为未来做好准备(较新的ZF版本,以及在同一个应用程序上工作的其他开发人员)

6 个答案:

答案 0 :(得分:10)

我找到了这个问题的解决方案,可能是框架版本1.10的新功能。在创建Zend Application对象时,您可以在两个合并在一起的options数组中传入2个配置文件路径:

$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/user.ini'
        ),
    )
);

答案 1 :(得分:6)

你知道这会合并你想要的inis吗?

在application.ini

[production]
config[] = APPLICATION_PATH "/configs/dsn.ini"
config[] = APPLICATION_PATH "/configs/error.ini"
...

答案 2 :(得分:5)

这没有任何问题,我做了类似的事情。我建议使用你的第二选择。我只有一个_initConfig()方法,负责使用Zend_Config_Ini加载用户配置。我不会扩展Zend_App,这看起来有点多。

编辑:

在回复您的评论时,您只需执行以下操作:

$this->bootstrap('config');

因此,为确保在DB之前加载配置,您需要具有以下内容:

protected function _initConfig()
{
    $config = new Zend_Config_Ini('/path/to/user.ini');
    return $config;
}

protected function _initDb()
{
    $this->bootstrap('config');
    $config = $this->getResource('Config');

    /* ... */
}

没有必要使用Zend_Registry,因为可以使用getResource()

访问Bootstrap _init方法返回的任何内容。

答案 3 :(得分:1)

配置文件可以包含“config”项,该项指的是另一个配置文件。 Zend_Application将包含此配置文件。包含的配置文件将具有首选项,并覆盖已在标准配置文件中定义的密钥。

昨天还在Zend Framework mailing list

上开了一个帖子

<强>实施例

的application.ini:

[production]
config = APPLICATION_PATH "/configs/config.ini"
resources.db.adapter = "Mysqli"
resources.db.host = "localhost"

的config.ini:

[production]
resources.db.host = "mysql.server.com"
resources.db.username = "myuser"

公共/ index.php的:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

答案 4 :(得分:0)

在类似的场景中,我看到在实例化应用程序时可以以编程方式提供特定于应用程序的参数。这有助于在config.ini

中放置与配置相关的参数

我实际上是这样做的:

在index.php中引导应用程序

     $application = new Zend_Application(APPLICATION_ENV, array(
                'resources' => array(
                   'FrontController' => array(
                       'controllerDirectory' => APPLICATION_PATH . '/main/controllers',
                    ),
                'layout' => array(
                    'layoutpath' => APPLICATION_PATH . "/layouts/scripts"
                    ),
                ),
            ));

and then inside the bootstrap parse the config.ini inidependently

    protected function _initConfigFile() {
        try {
            $configuration = new Zend_Config_Ini(
                APPLICATION_PATH . '/config/app.ini',
                APPLICATION_ENV );
            $registry->configuration = $configuration;
        } catch (Zend_Exception $zExp) {
            echo "Could not read application ini file (app.ini). "
                . " Please check that it exists and has the appropriate structure.\n";
            echo("\n");
            var_dump($zExp);
            exit(1);
        }
    }

在引导程序中

答案 5 :(得分:-1)

您可以通过在其他引导方法(需要配置对象)中指定类似以下内容来确保在其他方法之前调用_initConfig()引导方法:

$this->bootstrap('config');

更完整的示例(Bootstrap类的上下文):

protected function _initConfig() {
    $config = new Zend_Config_Ini('[filename]');
    Zend_Registry::set('config',$config);
}

protected function _initSomething() {
    $this->bootstrap('config');
    $config = Zend_Registry::get('config');
    // you can now do whatever you like with the $config object
}

更新

正如其他答案中提到的那样,如果仅在引导程序中需要配置,我会说使用$this->getResource('Config')方法。我使用注册表,以便可以在我的应用程序的其他部分轻松访问配置。