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 ' ); // value
getRawContent()
Получить необработанное, неанализированное содержимое из файла.
# 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). Дополнительную информацию см. в файле лицензии.