Как настроить Zend_Application с application.ini и user.ini - PullRequest
5 голосов
/ 10 января 2010

Я использую Zend_Application, и мне не нравится, что я смешиваю в своем application.ini как приложение, так и пользовательскую конфигурацию.

Я имею в виду следующее. Например, моему приложению нужны некоторые библиотечные классы в пространстве имен MyApp_. Поэтому в application.ini я поместил autoloaderNamespaces [] = "MyApp_". Это чистая конфигурация приложения, никто, кроме программиста, не сможет их изменить. С другой стороны, я поместил туда конфигурацию базы данных, что-то, что SysAdmin изменит.

Моя идея состоит в том, что я бы разделил параметры между application.ini и user.ini, где параметры в user.ini имеют преимущество (поэтому я могу определять стандартные значения в application.ini).

Это хорошая идея? Как я могу лучше всего реализовать это? Идея у меня есть

  • Расширение Zend_Application для принятия нескольких файлов конфигурации
  • Создание функции инициализации в моем Bootstrap при загрузке user.ini
  • Анализ файлов конфигурации в моем index.php и передача их в Zend_Application (звучит некрасиво)

Что мне делать? Я хотел бы иметь «самое чистое» решение, которое подготовлено для будущего (более новые версии ZF и другие разработчики, работающие над тем же приложением)

Ответы [ 6 ]

10 голосов
/ 01 февраля 2010

Я нашел решение этой проблемы, которое может быть новым для фреймворка версии 1.10. При создании объекта Zend Application вы можете передать 2 пути файла конфигурации в массиве параметров, которые объединяются вместе:

$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/user.ini'
        ),
    )
);
6 голосов
/ 28 мая 2010

Вы знаете, это объединит столько, сколько вы хотите?

в приложении .ini

[production]
config[] = APPLICATION_PATH "/configs/dsn.ini"
config[] = APPLICATION_PATH "/configs/error.ini"
...
5 голосов
/ 10 января 2010

В этом нет ничего плохого, я делаю что-то подобное. Я предлагаю использовать ваш второй выбор. У меня просто есть метод _initConfig (), который заботится о загрузке конфигурации пользователя с помощью Zend_Config_Ini. Я бы не стал расширять Zend_App, это кажется немного.

Edit:

В ответ на ваш комментарий вы просто сделаете:

$this->bootstrap('config');

Таким образом, чтобы убедиться, что конфиг загружен до БД, у вас должно быть что-то вроде:

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 ()

1 голос
/ 12 января 2010

Файл конфигурации может иметь элемент «config», который ссылается на другой файл конфигурации. Zend_Application будет включать этот файл конфигурации. Включенный файл конфигурации будет иметь преимущество, и перезаписывать ключи, уже определенные в стандартном файле конфигурации.

Вчера в списке рассылки Zend Framework

также была запущена тема

Примеры

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'
);
0 голосов
/ 12 января 2010

В аналогичном сценарии я видел, что специфические параметры приложения могут быть предоставлены программно при создании экземпляра приложения. Это помогло поместить параметры конфигурации в 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);
        }
    }

внутри бутстрапа

0 голосов
/ 10 января 2010

Вы можете убедиться, что метод начальной загрузки _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'). Я использую реестр, чтобы можно было легко получить доступ к конфигурации в других частях моего приложения.

...