1

現在、ブートストラップ内に、PHP ネイティブ配列を含む複数の構成ファイルをロードしています。

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

この設定では、「config-other.php」が「config-global.php」の $settings 配列を上書きしています。

ブートストラップ内に配列を追加する最善の方法についてアドバイスをお願いします。

ティム

アップデート

これは、Nikolaos の提案を実装しようとしている私のブートストラップ ファイルのセットアップの縮小版です。

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 通知: 未定義のプロパティ: Phalcon\DI\FactoryDe​​fault::$registry の /public/frontend/index.php 行 127

[2012 年 12 月 2 日 09:10:43] PHP 致命的なエラー: 127 行目の /public/frontend/index.php の非オブジェクトに対するメンバ関数 offsetExists() の呼び出し

4

1 に答える 1

4

これを試して:

DI コンテナに新しいサービスを登録する

// 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 コンテナー参照をクリアしたり、基本配列 (グローバル) を常にロードしたりすることもできます。

編集:コメントの後に少し変更しました

于 2012-11-21T23:38:47.390 に答える