Добавление нескольких массивов конфигурации в PhalconPHP

В настоящее время я загружаю несколько файлов конфигурации, содержащих собственные массивы PHP, в моем файле bootstrap.

require "app/configuration/config-global.php";
require "app/configuration/config-other.php";

При такой настройке config-other.php перезаписывает массив $settings файла config-global.php.

Могу ли я получить несколько советов о том, как лучше всего добавить массив в мой бутстрап, пожалуйста.

Тим

Обновить

Вот урезанная версия моей настройки загрузочного файла, пытающаяся реализовать предложение Николаоса.

class Application extends \Phalcon\Mvc\Application
{

    /**
     * Register the services here to make them general or register in the ModuleDefinition to make them module-specific
     */
    public function _registerServices()
    {

        //Define constants
        $di = new \Phalcon\DI\FactoryDefault();

        $loader = new \Phalcon\Loader();

        $di->set('registry', function () {
            return new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
        });

        //load our config into the registry
        //$di->set('config', $config);

        $this->setDI($di);
    }

    public function _loadConfig()
    {

        $di = \Phalcon\DI::getDefault();

        $this->processConfig('appConfig1');
        $this->processConfig('globalConfig');

        // Remember config_array is the merged array in the DI container
        $new_array = $di->registry->offsetGet('config_array');

        // Optional, store the config in your DI container for easier use
        $di->set('config', function () use ($new_array) {
                return new \Phalcon\Config($config);
            }
        );

    }

    public function main()
    {

        $this->_registerServices();
        $this->_loadConfig();

        echo $this->handle()->getContent();
    }

    public function processConfig($name)
    {

    $config = array();
    $di     = \Phalcon\DI::getDefault();

    if ($di->registry->offsetExists('config_array'))
    {
        $config = $di->registry->offsetGet('config_array');
    }

    // Now get the file from the config
    require "/config/{$name}.php";

    // $settings came from the previous require
    $new_config = array_merge($config, $settings);

    // Store it in the DI container
    $di->registry->offsetSet('config_array', $new_config);

    }

}

$application = new Application();
$application->main();

С приведенной выше конфигурацией я получаю:

[02-Dec-2012 09:10:43] Уведомление PHP: свойство Undefined: Phalcon\DI\FactoryDefault::$registry в /public/frontend/index.php в строке 127

[02-Dec-2012 09:10:43] Неустранимая ошибка PHP: вызов функции-члена offsetExists() для не-объекта в /public/frontend/index.php в строке 127.


person Tim    schedule 21.11.2012    source источник
comment
Это желаемое поведение? то есть config-global.php содержит, скажем, $settings в виде массива. А затем в config-other.php есть еще один массив $settings. Последний перезапишет первый. Вы хотите, чтобы они объединились?   -  person Nikolaos Dimopoulos    schedule 21.11.2012
comment
Привет, Николаос. Да, мне нужен объединенный массив $settings из нескольких файлов. Причина этого в том, что мое приложение на самом деле представляет собой множество приложений, каждое из которых имеет свои собственные данные для подключения к базе данных. Я надеюсь это имеет смысл   -  person Tim    schedule 22.11.2012


Ответы (1)


Попробуй это:

Зарегистрируйте новую службу в контейнере внедрения зависимостей

// Get the DI container
$di = \Phalcon\DI::getDefault();

$di->set(
    'registry', 
    function ()
    {
        return new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
    }
);

Выше будет «реестр», в котором мы будем хранить файлы конфигурации.

public function processConfig($name)
{
    $config = array();
    $di     = \Phalcon\DI::getDefault();

    if ($di->registry->offsetExists('config_array'))
    {
        $config = $di->registry->offsetGet('config_array');
    }

    // Now get the file from the config
    require ROOT_PATH . "app/configuration/{$name}.php";

    // $settings came from the previous require
    $new_config = array_merge($config, $settings);

    // Store it in the DI container
    $di->registry->offsetSet('config_array', $new_config);
}

И как использование вы можете сделать это:

processConfig('config-global');
processConfig('config-other');

// Remember config_array is the merged array in the DI container
$di = \Phalcon\DI::getDefault();

// Remember config_array is the merged array in the DI container
$new_array = $di->registry->offsetGet('config_array');

// Optional, store the config in your DI container for easier use
$di->set(
    'config', 
    function () use ($new_array)
    {
        return new \Phalcon\Config($config);
    }
};

Массив config в контейнере теперь содержит объединенные данные.

Вы также можете создать класс, который будет инкапсулировать эту функциональность и иметь другие вспомогательные функции для очистки ссылки на контейнер DI, для постоянной загрузки базового массива (глобального) и т. д.

EDIT: немного изменено после комментариев.

person Nikolaos Dimopoulos    schedule 21.11.2012
comment
Привет, Николаос! Большое спасибо за это. Это работает удовольствие! Быстрый связанный вопрос. Я определяю константу $config прямо под вызовами функции processConfig, $config = new \Phalcon\Config($new_config);. Это, конечно, не работает, так как выходит за рамки функции, в которой существует $new_config. Я знаю, что делать $new_config глобальной переменной — плохая идея, но не могли бы вы посоветовать, как еще я могу определить новую переменную конфигурации? Я также попытался добавить вызов в вашу функцию processConfig, но он не работает. Как вы можете сказать, я все еще новичок в принципах ООП. - person Tim; 26.11.2012
comment
Вам не нужно проходить через эту проблему. Используйте для этого контейнер DI. Проверьте мое редактирование выше. - person Nikolaos Dimopoulos; 27.11.2012
comment
Привет Николаос, Спасибо за ваш ответ! Я пытался использовать DI, но не смог заставить его работать. Я получаю следующее, когда я вызываю следующую строку. $new_array = $di-›get('config_array'); [Неперехваченное исключение «Phalcon\DI\Exception» с сообщением «Недопустимое определение службы. Отсутствует параметр 'className']. Я пробовал документацию по $di-›get, но ничего не понимаю. Прости за такую ​​боль. docs.phalconphp.com/en/0.5.0/api/ Phalcon_DI.html#методы - person Tim; 27.11.2012
comment
Поскольку эта проблема не имеет прямого отношения к этому вопросу, я создал новую в stackoverflow.com/questions/13636858/ - person Tim; 30.11.2012
comment
@Tim Я внес некоторые дополнительные изменения в код после прочтения вашего другого вопроса. Пожалуйста, посмотрите и дайте мне знать, если это работает для вас. - person Nikolaos Dimopoulos; 30.11.2012
comment
Привет, Николаос, я уверен, что с твоим кодом все в порядке, но у меня все еще есть проблемы. Может это с моей реализацией? Я добавил урезанную версию моего загрузочного файла к своему первоначальному вопросу ... Возможно, вы могли бы взглянуть и посмотреть, не ошибаюсь ли я. - person Tim; 02.12.2012