設定の読み込み

Phalcon\Configは、アプリケーションで使用するために、(アダプタを使用する)さまざまな形式の設定ファイルをPHPオブジェクトに変換するために使用されるコンポーネントです。

値は次のようにPhalcon\Configから取得できます。

<?php

use Phalcon\Config;

$config = new Config(
    [
        'test' => [
            'parent' => [
                'property'  => 1,
                'property2' => 'yeah',
            ],
        ],  
    ]
);

echo $config->get('test')->get('parent')->get('property');  // displays 1
echo $config->test->parent->property;                       // displays 1
echo $config->path('test.parent.property');                 // displays 1

Factory

Config Adapterクラスを読み込む際にadapter のオプションを使用すると、拡張子を指定していなくてもfilePath に追加されます。

<?php

use Phalcon\Config\Factory;

$options = [
    'filePath' => 'path/config',
    'adapter'  => 'php',
 ];

$config = Factory::load($options);

PHPの配列

最初の例は、ネイティブ配列をPhalcon\Configオブジェクトに変換する方法を示しています。 このオプションはリクエストされるまでファイルが読み込まれないので最高のパフォーマンスを提供します。

<?php

use Phalcon\Config;

$settings = [
    'database' => [
        'adapter'  => 'Mysql',
        'host'     => 'localhost',
        'username' => 'scott',
        'password' => 'cheetah',
        'dbname'   => 'test_db'
    ],
     'app' => [
        'controllersDir' => '../app/controllers/',
        'modelsDir'      => '../app/models/',
        'viewsDir'       => '../app/views/'
    ],
    'mysetting' => 'the-value'
];

$config = new Config($settings);

echo $config->app->controllersDir, "\n";
echo $config->database->username, "\n";
echo $config->mysetting, "\n";

プロジェクトをよりよく整理したい場合は、配列を別のファイルに保存してから読み込むことができます。

<?php

use Phalcon\Config;

require 'config/config.php';

$config = new Config($settings);

ファイルアダプター

使用可能なアダプタは次のとおりです:

クラス 説明
Phalcon\Config\Adapter\Ini INIファイルを使用して設定を保存します。 アダプタは内部的にPHP関数parse_ini_fileを使用します。
Phalcon\Config\Adapter\Json JSONファイルを使用して設定を保存します。
Phalcon\Config\Adapter\Php PHP多次元配列を使用して設定を保存します。 このアダプターは最高のパフォーマンスを提供します。
Phalcon\Config\Adapter\Yaml YAMLファイルを使用して設定を保存します。

INIファイルの読み込み

Iniファイルは、設定を保存する一般的な方法です。 Phalcon\Configは、最適化されたPHP関数parse_ini_fileを使用してこれらのファイルを読み取ります。 ファイル内の各セクションは、簡単にアクセスできるようにサブの設定として解釈されます。

[database]
adapter  = Mysql
host     = localhost
username = scott
password = cheetah
dbname   = test_db

[phalcon]
controllersDir = '../app/controllers/'
modelsDir      = '../app/models/'
viewsDir       = '../app/views/'

[models]
metadata.adapter  = 'Memory'

次のようにファイルを読むことができます:

<?php

use Phalcon\Config\Adapter\Ini as ConfigIni;

$config = new ConfigIni('path/config.ini');

echo $config->phalcon->controllersDir, "\n";
echo $config->database->username, "\n";
echo $config->models->metadata->adapter, "\n";

設定のマージ

Phalcon\Configはある構成オブジェクトのプロパティを別の構成オブジェクトに再帰的にマージすることができます。 新しいプロパティが追加され、既存のプロパティが更新されます。

<?php

use Phalcon\Config;

$config = new Config(
    [
        'database' => [
            'host'   => 'localhost',
            'dbname' => 'test_db',
        ],
        'debug' => 1,
    ]
);

$config2 = new Config(
    [
        'database' => [
            'dbname'   => 'production_db',
            'username' => 'scott',
            'password' => 'secret',
        ],
        'logging' => 1,
    ]
);

$config->merge($config2);

print_r($config);

上記のコードは次のようになります:

Phalcon\Config Object
(
    [database] => Phalcon\Config Object
        (
            [host] => localhost
            [dbname]   => production_db
            [username] => scott
            [password] => secret
        )
    [debug] => 1
    [logging] => 1
)

Phalcon Incubator には、このコンポーネントを利用するための複数のアダプターが用意されています。

ネストした設定

Phalcon\Config::pathメソッドを使用して、ネストされた設定値に簡単にアクセスできます。 この方法では、パスの一部が存在しないという事実を気にすることなく、値を得ることができます。 ひとつ、例を見てみましょう:

<?php

use Phalcon\Config;

$config = new Config(
   [
        'phalcon' => [
            'baseuri' => '/phalcon/'
        ],
        'models' => [
            'metadata' => 'memory'
        ],
        'database' => [
            'adapter'  => 'mysql',
            'host'     => 'localhost',
            'username' => 'user',
            'password' => 'passwd',
            'name'     => 'demo'
        ],
        'test' => [
            'parent' => [
                'property' => 1,
                'property2' => 'yeah'
            ],
        ],
   ]
);

// 区切り文字としてドットを使用する
$config->path('test.parent.property2');    // yeah
$config->path('database.host', null, '.'); // localhost

$config->path('test.parent'); // Phalcon\Config

// デリミタとしてスラッシュを使用する デフォルト値も指定でき、
// 設定オプションが存在しない場合はデフォルト値が返されます。
$config->path('test/parent/property3', 'no', '/'); // no

Config::setPathDelimiter('/');
$config->path('test/parent/property2'); // yeah

次の例は、有効なファサードを作成してネストされた構成値にアクセスする方法を示しています。

<?php

use Phalcon\Di;
use Phalcon\Config;

/**
 * @return mixed|Config
 */
function config() {
    $args = func_get_args();
    $config = Di::getDefault()->getShared(__FUNCTION__);

    if (empty($args)) {
       return $config;
    }

    return call_user_func_array([$config, 'path'], $args);
}

依存する設定のインジェクション

Phalcon\Mvc\Controllerの中でPhalcon\Configを使用できるように、コントローラに設定を注入することができます。 これを実行できるようにするには、Dependency Injectorコンテナにサービスとして追加する必要があります。 ブートストラップファイルの中に以下のコードを追加してください:

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Config;

// DIの生成
$di = new FactoryDefault();

$di->set(
    'config',
    function () {
        $configData = require 'config/config.php';

        return new Config($configData);
    }
);

コントローラではDIの機能を使って、以下のコードのようにconfigという名前で設定にアクセスできます:

<?php

use Phalcon\Mvc\Controller;

class MyController extends Controller
{
    private function getDatabaseName()
    {
        return $this->config->database->dbname;
    }
}