Vars ist ein einfach zu verwendender, leichter und leicht erweiterbarer Konfigurationslader mit integrierten Ladeprogrammen für ENV-, INI-, JSON-, PHP-, Toml-, XML- und YAML-Dateitypen. Es bietet außerdem integrierte Unterstützung für Silex, weitere Frameworks (Symfony, Laravel usw.) folgen in Kürze.
Manchmal sind Sie gezwungen, unterschiedliche Formate für Konfigurationsdateien zu verwenden, und eines der Ziele Vars besteht darin, Ihnen dies zu erleichtern, indem die gängigsten Konfigurationsformate unterstützt werden, sodass Sie nicht die Bibliothek wechseln müssen, um mit den verschiedenen Formaten umzugehen.
Ein weiteres Ziel besteht darin, verschiedene Frameworks zu unterstützen, damit Sie beim Umgang mit verschiedenen Frameworks nicht die Bibliothek wechseln müssen. Derzeit wird Silex nur über einen Dienstanbieter unterstützt. Die Unterstützung für Laravel und Symfony folgt in Kürze.
Mit einer einfachen API und intuitiven Ladeoptionen versucht Vars , das Laden und Bereitstellen von Konfigurationen für Sie so einfach wie möglich zu gestalten.
Vars erfordert PHP Version 5.3+ .
Wenn Sie YAML verwenden möchten, benötigen Sie die symfony/yaml -Bibliothek. Ebenso benötigen Sie yosymfony/toml um Toml-Dateien zu verwenden, und m1/env um Env-Dateien zu verwenden.
Über Komponist
$ 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 ' ,
)); Dies kann auf verschiedene Weise erfolgen: Sie können die Variable $ Vars als normales Array behandeln oder sie objektorientiert verwenden
// All return the same thing
$ Vars -> get ( ' db.password ' )
$ Vars [ ' db.password ' ];
$ Vars [ ' db ' ][ ' password ' ]Auf die gleiche Weise können Sie auch Werte festlegen
// All do the same thing
$ Vars -> set ( ' db.password ' , ' test ' )
$ Vars [ ' db.password ' ] = ' test ' ;
$ Vars [ ' db ' ][ ' password ' ] = ' test ' ; Sie können die Variablen auch von getenv() abrufen
// All do the same thing
$ Vars -> toEnv ();
getenv ( ' db.password ' );Weitere Informationen hierzu finden Sie im Abschnitt Umgebungsvariablen
Sie können Konfigurationen problemlos relativ und absolut in andere Konfigurationen importieren. Diese unterscheiden sich durch den Konfigurationsdateityp. Überprüfen Sie daher den Ordner /tests/mocks/ auf Beispiele
# example_1.yml
test_key_1 : test_value_1
imports : example_2.yml
# example_2.yml
test_key_2 : test_value_2Würde zurückkommen:
[
" test_key_1 " => " test_value_1 " ,
" test_key_2 " => " test_value_2 "
]Importe werden standardmäßig relativ zum Schlüssel importiert, z. B.:
test_key_1 :
imports : example_2.ymlWürde zurückkommen:
[
" test_key_1 " => [
" test_key_2 " => " test_value_2 "
]
]Sie können dies jedoch auf verschiedene Arten ändern:
# example 1
test_key_1 :
imports :
- {resource: example.yml, relative: false}
# example 2
test_key_2 :
imports :
resource : example.yml
relative : falseWenn Sie verschiedene Dateien importieren und die Relativität aller Dateien festlegen möchten, können Sie Folgendes tun:
test_key_1 :
imports :
relative : false
resource :
- example_2.yml
- example_3.yml All dies führt dazu, dass die Variablen example_2.yml und example_3.yml absolut für die Konfigurationsdatei werden:
[
" test_key_1 " => []
" test_key_2 " => " test_value_2 " // from example_2.yml
"test_key_3" => "test_value_3" // from example_3.yml
]Sie können Verzeichnisse auch mit der oben genannten Syntax importieren:
test_key_1 :
imports : sub/Das Importieren von Verzeichnissen erfolgt standardmäßig nicht rekursiv und durchsucht keine Ordner innerhalb von Ordnern. Sie können dies ändern, indem Sie einen rekursiven Schalter hinzufügen:
test_key_1 :
imports :
resource : sub/
recursive : trueoder durch Hinzufügen eines rekursiven Flags:
test_key_1 :
imports :
resource : sub/*Wie beim Laden von Dateien können Sie Verzeichnisse mit einem rekursiven Schalter massenimportieren:
test_key_1 :
imports :
recursive : false
resource :
- sub/
- sub1/Der Import von Verzeichnissen basiert auf Loadern und den von den Loadern unterstützten Erweiterungen. Weitere Einzelheiten finden Sie im Abschnitt „Loader“.
Beim Import können Sie verschiedene Flags verwenden.
Das if else-Flag ?: sorgt dafür, dass, wenn die erste Datei existiert, diese verwendet wird – andernfalls wird die andere definierte Datei verwendet, z. B.:
imports : " example_1.yml ?: example_2.yml "Hinweis: Sie müssen die Zeichenfolge in Anführungszeichen setzen, damit das Flag „if else“ funktioniert
Das Flag „Ausnahmen unterdrücken“ @ – unterdrückt Ausnahmen, bei denen Dateien nicht gefunden wurden. z.B:
imports : @file_does_not_exist.ymlDas rekursive Flag sorgt dafür, dass Verzeichnisse innerhalb von Verzeichnissen nach Dateien durchsucht werden. z.B:
imports :
resource : sub/*Sie können die oben genannten Flags auch kombinieren, sodass keine Ausnahme ausgelöst wird, wenn die Option „else file“ nicht vorhanden ist, z. B.:
imports : " example_1.yml ?: @example_2.yml "Sie können einzelne Dateien oder Ressourcen erhalten:
// All return the same thing
$ Vars -> getResource ( ' example_2.yml ' )-> get ( ' test_key_2 ' );
$ Vars -> getResource ( ' example_2.yml ' )[ ' test_key_2 ' ];Es gibt verschiedene Optionen für 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 '
]
]); Der path gibt an, wie der $filename in $ Vars ->getResource($filename) berechnet wird. Zum Beispiel:
Wenn Sie den path auf __DIR__.'/config' festlegen und __DIR__.'/app/test_1.yml' importieren:
# example_1.yml
imports : example_2.yml Dann wären sowohl example_1.yml als auch example_2.yml $filename ../app/test_1.yml bzw. ../app/test_1.yml .
Wenn kein path festgelegt ist, wird der erste Dateiressourcenpfad als path verwendet, z. B.:
// example 1
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' );
// example 2
$ Vars = new Vars ([
__DIR__ . ' /config/config.yml ' ,
__DIR__ . ' /sub/config.yml ' ,
]); Beide verwenden __DIR__.'/config' als path
Sie können in Vars drei Arten von Variablen verwenden: Replacements , In-file und Environment . Die Syntax lautet:
| Variablentyp | Syntax |
|---|---|
| Ersatz | %VARIABLE% |
| In der Datei | %$VARIABLE% |
| Umfeld | %^VARIABLE% |
Zur besseren Lesbarkeit können Sie auch Leerzeichen zwischen dem Variablennamen und dem Präfix/Suffix einfügen, etwa so:
replacement_variable : % VARIABLE %
infile_variable : %$ VARIABLE %
env_variable : %^ VARIABLE % Ersatzvariablen werden von außerhalb Vars geladen und werden daher häufig für PHP Funktionen/-Logik verwendet, z. B. __dir__ :
test_key_1 : %foo%
test_key_2 : /bar/%foobar%/bar $ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' replacements ' => [
' foo ' => ' bar ' ,
' foobar ' => ' barfoo '
],
]);Ausgänge:
[
" test_key_1 " => " bar " ,
" test_key_2 " => " /bar/barfoo/foobar/ "
] Ihre Ersetzungen müssen mit % als Präfix und Suffix erfolgen.
Sie können Variablen auch aus Dateien laden:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' replacements ' => __DIR__ . ' /config/variables.yml '
]);Sie können auch Variablen aus Ihren bereits definierten Schlüsseln in den Dateien verwenden, wie zum Beispiel:
test_key_1 : hello
test_key_2 : /bar/%$test_key_1%/barAusgänge:
[
" test_key_1 " => " bar " ,
" test_key_2 " => " /bar/hello/foobar/ "
] Ihre Ersetzungen müssen mit dem Präfix %$ und dem Suffix % versehen sein.
Sowohl für in-file als auch replacements können Sie die Punktnotationssyntax verwenden, um Arrays abzurufen, z. B.:
test_key_1 :
test_key_2 : hello
test_key_3 : /bar/%$test_key_1.test_key_2%/barAusgänge:
[
" test_key_1 " => array (
" test_key_2 " => " hello "
),
" test_key_2 " => " /bar/hello/foobar/ "
]Sie können auch Umgebungsvariablen verwenden, um Ersetzungen vorzunehmen:
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;
}Ausgänge:
[
" test_key_1 " => " test_username " ,
" test_key_2 " => " test_password "
] Ihre Umgebungsvariablen müssen mit dem Präfix %^ und dem Suffix % versehen sein.
Sie können es auch so gestalten, dass Ihr Konfigurationsarray für getenv() verfügbar ist:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' );
$ Vars -> toEnv ();Hinweis: Ihre Konfiguration wird hierfür auf eine Punktnotation reduziert, z. B.:
test_key_1 :
test_key_2 : valueWird abgerufen von:
getenv ( ' test_key_1.test_key_2 ' ); // value Globals in Vars beziehen sich auf Variablen, die als solche definiert sind:
_globals :
test_key_1 : test_value_1 Im Grunde sind sie nur in einem _globals Array gekapselt – die Verwendung erfolgt, damit Sie über getGlobals() von Vars aus darauf zugreifen können
Die Standardaktion besteht darin, sie mit den anderen Dateiinhalten zusammenzuführen, sodass:
_globals :
test_key_1 : test_value_1
test_key_2 : test_value_2Wird:
[
' test_key_1 ' => ' test_value_1 ' ,
' test_key_2 ' => ' test_value_2 ' ,
] Sie können dies jedoch überschreiben, indem Sie merge_globals über die Optionen auf false ändern.
Wenn dies keinen Sinn ergibt, müssen Sie wahrscheinlich überhaupt keine Globals verwenden, aber sie sind nützlich für die Arbeit mit Frameworks, die alles unter beispielsweise $app kapseln, und Sie möchten auf einige Schlüssel => Werte wie zugreifen können also: $app['test_key_1'] . Weitere Beispiele finden Sie im Abschnitt „Silex-Anbieter“.
Vars speichert die Ressourcen automatisch 5 Minuten lang im Cache. Sie können dies deaktivieren, indem Sie die cache Option auf false setzen.
Wenn der cache_path nicht festgelegt ist, wird er auf den path festgelegt, auf den er festgelegt ist. Der cache_path muss beschreibbar sein.
Um den Cache ungültig zu machen, entfernen Sie einfach den Ordner namens Vars in Ihrem cache_path , z. B.: rm -rf /var/www/application/app/cache/ Vars
Aufgrund der zusätzlichen Beschleunigung von Opcache ist die Cache-Datei eine .php-Datei.
Wenn Sie den Silex-Anbieter verwenden, wird der Cache nicht verwendet und festgelegt, wenn Sie sich im Debug-Modus befinden.
Die Loader ermöglichen es Vars die verschiedenen Dateitypen zu lesen (Standard sind Ini, Json, PHP, Toml, Xml und Yaml).
Sie können Loader über die Optionen aktivieren und deaktivieren:
Default lädt alle Standardlader:
$ 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 '
]
]); Um Ihren eigenen benutzerdefinierten Loader zu erstellen, müssen Sie M1 Vars LoaderAbstractLoader erweitern, die unterstützten Erweiterungen im public static $supported -Array haben und über eine public function load() verfügen, die den Inhalt der Datei lädt.
Hier ist ein einfaches Beispiel, das TXT-Dateien lädt:
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 ;
}
}Um diesen Loader dann zu verwenden, würden Sie einfach Folgendes verwenden:
$ Vars = new Vars ( __DIR__ . ' /config/config.yml ' , [
' loaders ' => [
' M1FooBarLoaderTextLoader ' ,
]
]);Hinweis: Verwenden Sie diesen Loader nicht im echten Leben, er dient ausschließlich Präsentationszwecken
Es ist ziemlich einfach, diese Bibliothek mit Silex zu verwenden. Registrieren Sie sie einfach, wenn Sie andere Dienstanbieter registrieren:
$ 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 ' ,
]]); Dann können Sie über $app[' Vars '] auf Ihre Konfiguration zugreifen.
Hinweis: Wenn $app['debug'] = true ist, wird der Cache nicht verwendet.
Sie können auch über $app auf die Konfigurationswerte zugreifen, indem Sie die Punktnotation verwenden, z. B.:
test_key_1 :
test_key_2 : value
test_key_3 : valueSie können das Obige mit der Punktnotation wie folgt erhalten:
$ app [ ' Vars ' ][ ' test_key_1.test_key_2 ' ]; // value
$ app [ ' Vars ' ][ ' test_key_3 ' ]; // value Sie können Globals auch wie folgt in $app zusammenführen:
# 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 ' ](); Beachten Sie $app[' Vars .merge']() – Dies überschreibt die Standardeinstellungen des Dienstanbieters, sodass monolog in diesem Beispiel die in der Vars -Konfiguration definierte Protokolldatei verwendet.
Sie müssen Vars .merge aufrufen, nachdem Sie die Dienstanbieter aufgerufen haben, für die Sie in Ihrer Konfiguration Konfigurationswerte bereitstellen.
Sie können auch über $app[' Vars .test_key_1'] auf test_key_1 zugreifen, und wenn Sie möchten, können Sie auf ähnliche Weise auf Globals wie $app['monolog.logfile'] zugreifen.
Vars ($resource, $options = array())Der Konstruktor zum Erstellen einer neuen Vars -Konfiguration:
$ 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()Gibt den analysierten Inhalt aller Konfigurationen zurück.
getResource($resource)Ruft eine angegebene Ressource ab, gibt eine Dateiressource zurück oder false, wenn die Ressource nicht vorhanden ist.
Der $resource Ressourcenname basiert auf dem im Basispfad definierten Pfad und dem Dateinamen.
# 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() Gibt alle importierten Ressourcen zurück. Dabei handelt es sich um FileResource Objekte.
toEnv() Macht es so, dass die Konfiguration über getenv() verfügbar ist:
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> toEnv ();
getenv ( ' test_1 ' ); // value toDots()Führt dazu, dass die Konfiguration zu einem Array mit Punktnotation zusammengefasst wird
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() Ruft die in _globals definierten Werte ab
set($key, $value)Legen Sie einen Konfigurationsschlüssel fest:
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> set ( ' test_key_1 ' , ' value_2 ' );get($key)Ruft einen Konfigurationsschlüssel ab:
$ Vars = new Vars ( ' example.yml ' );
$ Vars -> get ( ' test_key_1 ' ); // valuegetRawContent()Holen Sie sich den rohen, ungeparsten Inhalt aus der Datei
# 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()Siehe getContent()
get($key)Siehe get()
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
$ composer test Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie sicherheitsrelevante Probleme entdecken, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.