Чтение конфигураций

Phalcon\Config is a component used to convert configuration files of various formats (using adapters) into PHP objects for use in an application.

Значения могут быть получены из Phalcon\Config следующим образом:

<?php

use Phalcon\Config;

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

echo $config->get('test')->get('parent')->get('property');  // выведет 1
echo $config->test->parent->property;                       // выведет 1
echo $config->path('test.parent.property');                 // выведет 1

Фабрика

Загружает адаптер конфигурации используя параметр adapter. Если расширение файла не было предоставлено, параметр будет добавлен к filePath

<?php

use Phalcon\Config\Factory;

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

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

Native Arrays

The first example shows how to convert native arrays into Phalcon\Config objects. This option offers the best performance since no files are read during this request.

<?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 Uses INI files to store settings. Internally the adapter uses the PHP function parse_ini_file.
Phalcon\Config\Adapter\Json Использует JSON-файлы для хранения конфигурации.
Phalcon\Config\Adapter\Php Uses PHP multidimensional arrays to store settings. This adapter offers the best performance.
Phalcon\Config\Adapter\Yaml Использует YAML-файлы для хранения конфигурации.

Чтение INI-файлов

Ini-файлы являются довольно распространённым способом хранения настроек. Phalcon\Config uses the optimized PHP function parse_ini_file to read these files. Разделы файла разбиваются в подпункты конфигурации для более лёгкого доступа.

[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 can recursively merge the properties of one configuration object into another. New properties are added and existing properties are updated.

<?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);
}

Внедрение зависимости конфигурации

You can inject your configuration to the controller allowing us to use Phalcon\Config inside Phalcon\Mvc\Controller. Для этого вам необходимо добавить конфигурацию как сервис в контейнер зависимостей приложения. Добавьте следующий код в ваш сервис-провайдер:

<?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);
    }
);

Теперь в контроллере вы можете получить доступ к конфигурации, используя возможность внедрения зависимости, указав имя config, как показано ниже:

<?php

use Phalcon\Mvc\Controller;

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