Vars 、ENV、INI、JSON、PHP、Toml、XML、YAML ファイル タイプ用の組み込みローダーを備えた、使いやすく軽量で簡単に拡張可能な構成ローダーです。また、近々追加される予定の他のフレームワーク (Symfony、Laravel など) による Silex のサポートも組み込まれています。
場合によっては、構成ファイルに異なる形式を使用する必要が生じることがあります。Vars Vars目的の 1 つは、最も一般的な構成形式をサポートすることでこれを簡素化し、異なる形式に対応するためにライブラリを切り替える必要がないようにすることです。
もう 1 つの目的は、さまざまなフレームワークをサポートすることで、さまざまなフレームワークを扱うときにライブラリを切り替える必要がなくなります。現在はサービスプロバイダーを使用した Silex のみをサポートしていますが、Laravel と Symfony も間もなくサポートされる予定です。
シンプルな API と直感的な読み込みオプションを使用して、 Vars構成の読み込みと提供をできるだけ簡単に行えるように努めます。
Vars PHP バージョン5.3+
が必要です。
YAML を使用したい場合は、 symfony/yaml
ライブラリが必要になります。同様に、Toml ファイルを使用するにはyosymfony/toml
必要で、Env ファイルを使用するにはm1/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/*
ファイルのロードと同様に、1 つの再帰的切り替えでディレクトリを一括インポートできます。
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
$ Vars ->getResource($filename)
の$filename
の計算方法です。例えば:
path
を__DIR__.'/config'
に設定し、 __DIR__.'/app/test_1.yml'
をインポートした場合:
# example_1.yml
imports : example_2.yml
この場合、 example_1.yml
とexample_2.yml
$filename
それぞれ../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 ' ,
]);
どちらもpath
として__DIR__.'/config'
を使用します
Vars
では 3 種類の変数 ( Replacements
、 In-file
、 Environment
を使用できます。構文は次のとおりです。
変数の型 | 構文 |
---|---|
交換品 | %VARIABLE% |
インファイル | %$VARIABLE% |
環境 | %^VARIABLE% |
読みやすくするために、次のように変数名と接頭辞/接尾辞の間にスペースを入れることもできます。
replacement_variable : % VARIABLE %
infile_variable : %$ VARIABLE %
env_variable : %^ VARIABLE %
置換変数はVars
外部からロードされるため、 __dir__
などのPHP
関数/ロジックによく使用されます。
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
Vars
のGlobals
、次のように定義された変数を参照します。
_globals :
test_key_1 : test_value_1
基本的に、これらは_globals
配列にカプセル化されているだけです。これらを使用すると、 Vars
のgetGlobals()
からアクセスできるようになります。
デフォルトのアクションでは、これらを他のファイルの内容にマージすることにより、次のようになります。
_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
書き込み可能である必要があります。
キャッシュを無効にするには、単にVars
と呼ばれる、 cache_path
内のフォルダーを削除するだけです (例: rm -rf /var/www/application/app/cache/ Vars
opcache の高速化により、キャッシュ ファイルは .php ファイルになります。
Silex プロバイダーを使用している場合、デバッグ モードではキャッシュは使用されず、設定されません。
ローダーは、 Varsさまざまなファイル タイプ (デフォルトは Ini、Json、Php、Toml、Xml、および Yaml) を読み取れるようにするものです。
次のオプションを使用してローダーを有効または無効にできます。
Default は、すべてのデフォルト ローダーをロードします。
$ 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
を呼び出す必要があります。
$app[' Vars .test_key_1']
経由で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)
get() を参照してください。
最近の変更点の詳細については、CHANGELOG を参照してください。
$ composer test
詳細については、「貢献」を参照してください。
セキュリティ関連の問題を発見した場合は、問題トラッカーを使用する代わりに [email protected] に電子メールを送信してください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。