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_2
Wü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.yml
Wü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 : false
Wenn 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 : true
oder 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.yml
Das 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%/bar
Ausgä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%/bar
Ausgä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 : value
Wird 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_2
Wird:
[
' 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 : value
Sie 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 ' ); // value
getRawContent()
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.