Чтение конфигураций
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);
Файловые адаптеры
Доступные адаптеры:
Чтение 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;
}
}