02 Конфигурация
Чтение конфигураций
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'); // выведет 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);
Собственные массивы
В первом примере показано, как преобразовать собственные массивы в объекты 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 | 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 files are a common way to store settings. Phalcon\Config uses the optimized PHP function parse_ini_file
to read these files. Files sections are parsed into sub-settings for easy access.
[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', '/'); // нет Config::setPathDelimiter('/'); $config->path('test/parent/property2'); // да
Следующий пример показывает, один из способов создания фасада, для получения вложенной конфигурации:
<?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\Config в экземплярах 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; } }