5

我正在使用 Zend_Application 并且在我的 application.ini 中混合应用程序和用户配置感觉不对。

我的意思如下。例如,我的应用程序需要命名空间 MyApp_ 中的一些库类。所以在 application.ini 我把 autoloaderNamespaces[] = "MyApp_"。这是纯粹的应用程序配置,除了程序员之外没有人会改变这些。另一方面,我放了一个数据库配置,系统管理员会改变的东西。

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

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

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

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

4

6 回答 6

10

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

$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/user.ini'
        ),
    )
);
于 2010-02-01T14:17:23.933 回答
6

你知道这会合并尽可能多的inis吗?

在应用程序.ini

[production]
config[] = APPLICATION_PATH "/configs/dsn.ini"
config[] = APPLICATION_PATH "/configs/error.ini"
...
于 2010-05-27T21:29:11.673 回答
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,因为 Bootstrap _init 方法返回的任何内容都可以使用 getResource() 访问

于 2010-01-10T12:06:19.330 回答
1

配置文件可以具有引用另一个配置文件的“配置”项。Zend_Application 将包含这个配置文件。包含的配置文件将具有优先权,并覆盖标准配置文件中已经定义的键。

昨天在Zend Framework 邮件列表上也开始了一个线程

例子

应用程序.ini:

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

配置.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'
);
于 2010-01-12T19:52:44.043 回答
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);
        }
    }

在引导程序内部

于 2010-01-11T22:46:35.923 回答
-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')方法。我使用注册表,以便可以在我的应用程序的其他部分轻松访问配置。

于 2010-01-10T17:04:26.920 回答