Vars — это простой в использовании, легкий и легко расширяемый загрузчик конфигурации со встроенными загрузчиками для типов файлов ENV, INI, JSON, PHP, Toml, XML и YAML. Он также имеет встроенную поддержку Silex, а в ближайшее время появятся и другие фреймворки (Symfony, Laravel и т. д.).
Иногда вам приходится использовать разные форматы файлов конфигурации, и одна из целей Vars — упростить вам эту задачу, поддерживая наиболее распространенные форматы конфигурации, чтобы вам не приходилось переключать библиотеки для работы с разными форматами.
Другая цель — поддержка различных фреймворков, чтобы вам снова не приходилось переключать библиотеки при работе с разными фреймворками. В настоящее время Silex поддерживается только через поставщика услуг, поддержка Laravel и Symfony появится в ближайшее время.
Благодаря простому API и интуитивно понятным параметрам загрузки Vars пытается максимально упростить загрузку и предоставление конфигурации.
Vars требуется PHP версии 5.3+ .
Если вы хотите использовать YAML, вам понадобится библиотека symfony/yaml , а также yosymfony/toml для использования файлов Toml и m1/env для использования файлов Env.
Через композитор
$ composer require m1/ Vars // load single file
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' );
// load from dir
$ Vars = new Vars ( __DIR__ . ' /config ' );
// load from array
$ Vars = new Vars ( array (
__DIR__ . ' /config/config.yml ' ,
__DIR__ . ' /config/sub ' ,
)); Это можно сделать разными способами: вы можете обращаться с переменной $ Vars как с обычным массивом или использовать ее объектно-ориентированным способом.
// All return the same thing
$ Vars -> get ( ' db.password ' )
$ Vars [ ' db.password ' ];
$ Vars [ ' db ' ][ ' password ' ]Вы также можете установить значения таким же образом
// All do the same thing
$ Vars -> set ( ' db.password ' , ' test ' )
$ Vars [ ' db.password ' ] = ' test ' ;
$ Vars [ ' db ' ][ ' password ' ] = ' test ' ; Вы также можете получить переменные из getenv()
// All do the same thing
$ Vars -> toEnv ();
getenv ( ' db.password ' );Для получения дополнительной информации об этом проверьте раздел «Переменные среды».
Вы можете легко относительно и абсолютно импортировать конфигурации в другие конфигурации, они различаются типом файла конфигурации, поэтому проверьте папку /tests/mocks/ для примеров.
# example_1.yml
test_key_1 : test_value_1
imports : example_2.yml
# example_2.yml
test_key_2 : test_value_2Вернулся бы:
[
" test_key_1 " => " test_value_1 " ,
" test_key_2 " => " test_value_2 "
]По умолчанию импорт импортируется относительно ключа, например:
test_key_1 :
imports : example_2.ymlВернулся бы:
[
" test_key_1 " => [
" test_key_2 " => " test_value_2 "
]
]Однако вы можете изменить это различными способами:
# example 1
test_key_1 :
imports :
- {resource: example.yml, relative: false}
# example 2
test_key_2 :
imports :
resource : example.yml
relative : falseЕсли вы импортируете различные файлы и хотите установить относительность всех файлов, вы можете сделать следующее:
test_key_1 :
imports :
relative : false
resource :
- example_2.yml
- example_3.yml Все вышеперечисленное приводит к тому, что переменные example_2.yml и example_3.yml становятся абсолютными для файла конфигурации:
[
" test_key_1 " => []
" test_key_2 " => " test_value_2 " // from example_2.yml
"test_key_3" => "test_value_3" // from example_3.yml
]Вы также можете импортировать каталоги, используя весь приведенный выше синтаксис:
test_key_1 :
imports : sub/Импорт каталогов по умолчанию не рекурсивный и не выполняет поиск папок внутри папок. Вы можете изменить это, добавив рекурсивный переключатель:
test_key_1 :
imports :
resource : sub/
recursive : trueили добавив рекурсивный флаг:
test_key_1 :
imports :
resource : sub/*Как и в случае с загрузкой файлов, вы можете массово импортировать каталоги с помощью одного рекурсивного переключателя:
test_key_1 :
imports :
recursive : false
resource :
- sub/
- sub1/Импорт каталогов зависит от загрузчиков и поддерживаемых ими расширений. Более подробную информацию смотрите в разделе загрузчик.
При импорте вы можете использовать различные флаги.
Флаг if else ?: делает так, что если первый файл существует, используйте его, иначе используйте другой определенный файл, например:
imports : " example_1.yml ?: example_2.yml "Примечание. Чтобы флаг if else работал, вам необходимо заключить строку в кавычки.
Флаг подавления исключений @ -- подавляет исключения для файлов, не найденных. например:
imports : @file_does_not_exist.ymlФлаг рекурсивности позволяет искать файлы в каталогах внутри каталогов. например:
imports :
resource : sub/*Вы также можете комбинировать вышеуказанные флаги, поэтому, если параметр else file не существует, исключение не будет выдано, например:
imports : " example_1.yml ?: @example_2.yml "Вы можете получить отдельные файлы или ресурсы:
// All return the same thing
$ Vars -> getResource ( ' example_2.yml ' )-> get ( ' test_key_2 ' );
$ Vars -> getResource ( ' example_2.yml ' )[ ' test_key_2 ' ];Существуют различные варианты Vars
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
// this will affect how you getResource() and will default to the path
// of the first resource you initiate
' path ' => __DIR__ . ' /config ' ,
// to cache or not -- defaults to true
' cache ' => true ,
// where the cache is stored -- If not set will default to the base path
' cache_path ' => __DIR__ . ' /config/ ' ,
// How long the cache lasts for -- Defaults to 300 seconds (5 minutes)
' cache_expire ' => 300 ,
// Replacement variables -- see variables section for more detail
' replacements ' => [
' foo ' => ' bar ' ,
' foobar ' => ' barfoo '
],
// Merge globals -- see globals section for more detail
' merge_globals ' => true ,
// The file loaders to load the configs -- see loader section for more detail
' loaders ' => [
' default '
]
]); path — это то, как вычисляется $filename в $ Vars ->getResource($filename) . Например:
Если вы установили path __DIR__.'/config' и импортировали __DIR__.'/app/test_1.yml' :
# example_1.yml
imports : example_2.yml Тогда $filename example_1.yml и example_2.yml будут иметь ../app/test_1.yml и ../app/test_1.yml соответственно.
Если path не указан, то в качестве path будет использоваться первый путь к файловому ресурсу, например:
// example 1
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' );
// example 2
$ Vars = new Vars ([
__DIR__ . ' /config/config.yml ' ,
__DIR__ . ' /sub/config.yml ' ,
]); Оба будут использовать __DIR__.'/config' в качестве path
Вы можете использовать 3 типа переменных в Vars : Replacements , In-file и Environment . Синтаксис следующий:
| Тип переменной | Синтаксис |
|---|---|
| Замены | %VARIABLE% |
| В файле | %$VARIABLE% |
| Среда | %^VARIABLE% |
Для лучшей читаемости вы также можете ставить пробелы между именем переменной и префиксом/суффиксом, например:
replacement_variable : % VARIABLE %
infile_variable : %$ VARIABLE %
env_variable : %^ VARIABLE % Замещающие переменные загружаются извне Vars , поэтому они часто используются для функций/логики PHP , таких как __dir__ :
test_key_1 : %foo%
test_key_2 : /bar/%foobar%/bar $ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' replacements ' => [
' foo ' => ' bar ' ,
' foobar ' => ' barfoo '
],
]);Выходы:
[
" test_key_1 " => " bar " ,
" test_key_2 " => " /bar/barfoo/foobar/ "
] Ваши замены должны иметь префикс и суффикс %
Вы также можете загружать переменные из файлов:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' replacements ' => __DIR__ . ' /config/variables.yml '
]);Вы также можете использовать переменные из уже определенных вами ключей в файлах, например:
test_key_1 : hello
test_key_2 : /bar/%$test_key_1%/barВыходы:
[
" test_key_1 " => " bar " ,
" test_key_2 " => " /bar/hello/foobar/ "
] Ваши замены должны иметь префикс %$ и суффикс % .
Как для in-file , так и replacements вы можете использовать синтаксис точечной записи для получения массивов, например:
test_key_1 :
test_key_2 : hello
test_key_3 : /bar/%$test_key_1.test_key_2%/barВыходы:
[
" test_key_1 " => array (
" test_key_2 " => " hello "
),
" test_key_2 " => " /bar/hello/foobar/ "
]Вы также можете использовать переменные среды для замены:
test_key_1 : %^DATABASE_USERNAME%
test_key_2 : %^DATABASE_PASSWORD% # nginx config example
location @site {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root /index.php;
# env variables
fastcgi_param DATABASE_USERNAME test_username;
fastcgi_param DATABASE_PASSWORD test_password;
}Выходы:
[
" test_key_1 " => " test_username " ,
" test_key_2 " => " test_password "
] Переменные среды должны иметь префикс %^ и суффикс %
Вы также можете сделать так, чтобы ваш массив конфигурации был доступен для getenv() :
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' );
$ Vars -> toEnv ();Примечание. Для этого ваша конфигурация будет преобразована в точечную запись, например:
test_key_1 :
test_key_2 : valueДоступ к нему получат:
getenv ( ' test_key_1.test_key_2 ' ); // value Globals в Vars относятся к переменным, определенным следующим образом:
_globals :
test_key_1 : test_value_1 По сути, они просто инкапсулированы в массив _globals — они используются для доступа к ним из getGlobals() из Vars
Действием по умолчанию является объединение их с другим содержимым файла, чтобы:
_globals :
test_key_1 : test_value_1
test_key_2 : test_value_2Становится:
[
' test_key_1 ' => ' test_value_1 ' ,
' test_key_2 ' => ' test_value_2 ' ,
] Но вы можете переопределить это, изменив merge_globals на false с помощью параметров.
Если это не имеет смысла, то вам, вероятно, вообще не понадобится использовать глобальные переменные, но они полезны для работы с фреймворками, которые инкапсулируют все, скажем, в $app и вы хотите иметь доступ к некоторым значениям ключа =>, например итак: $app['test_key_1'] . Дополнительные примеры см. в разделе «Поставщик Silex».
Vars автоматически кэширует ресурсы в течение 5 минут. Вы можете отключить это, установив для параметра cache значение false .
Если cache_path не установлен, то устанавливается тот же path . cache_path должен быть доступен для записи.
Чтобы сделать кеш недействительным, просто удалите папку внутри вашего cache_path под названием Vars , например: rm -rf /var/www/application/app/cache/ Vars
Файл кеша представляет собой файл .php из-за дополнительного ускорения opcache.
Если вы используете поставщика Silex, то кеш не будет использоваться и устанавливаться, если вы находитесь в режиме отладки.
Загрузчики позволяют Vars читать файлы разных типов (по умолчанию — Ini, Json, Php, Toml, Xml и Yaml).
Вы можете включать и отключать загрузчики с помощью опций:
По умолчанию загружаются все загрузчики по умолчанию:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' loaders ' => ' default '
]);
// You can load individual loaders:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' loaders ' => [
' ini ' ,
' json '
[
]);
//You can also create and load custom loaders:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' loaders ' => [
' FooBarCustomFooBarLoader ' ,
' ini ' ,
' json '
]
]); Чтобы создать свой собственный загрузчик, вы должны расширить M1 Vars LoaderAbstractLoader , иметь поддерживаемые расширения в public static $supported и иметь public function load() которая загружает содержимое файла.
Вот примитивный пример загрузки файлов .txt:
namespace M1 Foo Bar Loader ;
use M1 Vars Loader AbstractLoader ;
class TextLoader extends AbstractLoader
{
public static $ supported = array ( ' txt ' );
public function load ()
{
$ content = [];
foreach ( file ( $ this -> entity ) as $ line ) {
list ( $ key , $ value ) = explode ( ' : ' , $ line , 2 );
$ content [ trim ( $ key )] = trim ( $ value );
}
$ this -> content = $ content ;
return $ this ;
}
}Затем, чтобы использовать этот загрузчик, вам просто нужно использовать:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' loaders ' => [
' M1FooBarLoaderTextLoader ' ,
]
]);Примечание: не используйте этот загрузчик по-настоящему, он предназначен исключительно для презентационных целей.
Использовать эту библиотеку с Silex довольно просто, просто зарегистрируйте ее при регистрации других поставщиков услуг:
$ app -> register ( new M1 Vars Provider Silex Vars ServiceProvider ( ' example.yml ' ), [
' Vars .path ' => __DIR__ . ' /../../app/config/test/ ' ,
' Vars .options ' => [
' cache ' => true ,
' cache_path ' => __DIR__ . ' /../../app/config/cache/ ' ,
' cache_expire ' => 500 ,
' replacements ' => [
' test ' => ' test_replacement '
],
' loaders ' => [
' yml ' ,
' json '
],
' merge_globals ' => true ,
' replacements ' => __DIR__ . ' /../../app/config/replacements.json ' ,
]]); Затем вы можете получить доступ к своей конфигурации из $app[' Vars ']
Примечание. Если вы $app['debug'] = true , кеш не будет использоваться.
Вы также можете получить доступ к значениям конфигурации из $app, используя точечную запись, например:
test_key_1 :
test_key_2 : value
test_key_3 : valueВы можете получить вышеизложенное, используя точечную запись следующим образом:
$ app [ ' Vars ' ][ ' test_key_1.test_key_2 ' ]; // value
$ app [ ' Vars ' ][ ' test_key_3 ' ]; // value Вы также можете объединить глобальные переменные в $app следующим образом:
# example.yml
_globals :
monolog.logfile : log.log
test_key_1 : test_value_2 $ app -> register ( new M1 Vars Provider Silex Vars ServiceProvider ( ' example.yml ' ));
// register monolog here and other service providers
$ app [ ' Vars .merge ' ](); Обратите внимание на $app[' Vars .merge']() — он переопределяет настройки поставщика услуг по умолчанию, поэтому в этом примере monolog будет использовать файл журнала, определенный в конфигурации Vars .
Вы должны вызвать Vars .merge после того, как позвоните поставщикам услуг, для которых вы предоставляете значения конфигурации в своей конфигурации.
Вы также можете получить доступ к test_key_1 через $app[' Vars .test_key_1'] и аналогично, если хотите, вы можете получить доступ к глобальным переменным, например, $app['monolog.logfile'] .
Vars ($resource, $options = array())Конструктор для создания новой конфигурации Vars :
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
// this will affect how you getResource() and will default to the path
// of the first resource you initiate
' path ' => __DIR__ . ' /config ' ,
// to cache or not -- defaults to true
' cache ' => true ,
// where the cache is stored -- If not set will default to the base path
' cache_path ' => __DIR__ . ' /config/ ' ,
// How long the cache lasts for -- Defaults to 300 seconds (5 minutes)
' cache_expire ' => 300 ,
// Replacement variables -- see variables section for more detail
' replacements ' => [
' foo ' => ' bar ' ,
' foobar ' => ' barfoo '
],
// The file loaders to load the configs -- see loader section for more detail
' loaders ' => [
' default '
]
]);getContent()Возвращает проанализированное содержимое всех конфигураций.
getResource($resource)Получить указанный ресурс, возвращает файловый ресурс или false, если ресурс не существует.
Имя $resource основано на пути, определенном в базовом пути, и имени файла.
# example.yml
imports : example2.yml
test_1 : value
# example2.yml
test_2 : value $ Vars = new Vars ( ' example.yml ' );
$ Vars -> getResource ( ' example2.yml ' ); // FileResource
$ Vars -> getResource ( ' example2.yml ' )-> getContent ();
# output:
# [
# "test_2" => "value"
# ] getResources() Возвращает все импортированные ресурсы, они будут объектами FileResource .
toEnv() Делает конфигурацию доступной через getenv() :
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> toEnv ();
getenv ( ' test_1 ' ); // value toDots()Делает так, что конфигурация сводится к массиву точечных обозначений.
test_value_1 :
test_value_2 : value
test_value_3 : value $ Vars = new Vars ( ' example.yml ' );
$ Vars -> toDots ();
# output:
# [
# "test_value_1.test_value_2" => "value",
# "test_value_1.test_value_3" => "value
# ] getGlobals() Получает значения, определенные в _globals
set($key, $value)Установите ключ конфигурации:
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> set ( ' test_key_1 ' , ' value_2 ' );get($key)Получает ключ конфигурации:
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> get ( ' test_key_1 ' ); // valuegetRawContent()Получить необработанное, неанализированное содержимое из файла.
# example.yml
test_value_1 :
imports : example2.yml
test_value_2 : %root%/foo/%dir% $ Vars = new Vars ( ' example.yml ' );
$ Vars -> getResource ( ' example.yml ' )-> getRawContent ();
# output:
# [
# test_value_1:
# imports: example2.yml
# test_value_2: %root%/foo/%dir%
# ] getContent()См. getContent().
get($key)См. получение()
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
$ composer test Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружите какие-либо проблемы, связанные с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.