يعد Vars أداة تحميل تكوين سهلة الاستخدام وخفيفة الوزن وقابلة للتمديد بسهولة مع أدوات تحميل مدمجة لأنواع ملفات ENV وINI وJSON وPHP وToml وXML وYAML. كما يأتي أيضًا دعمًا مدمجًا لـ Silex مع المزيد من أطر العمل (Symfony وLaravel وما إلى ذلك) التي ستتوفر قريبًا.
أحيانًا تكون مجبرًا على استخدام تنسيقات مختلفة لملفات التكوين، وأحد أهداف Vars هو جعل ذلك أسهل بالنسبة لك من خلال دعم تنسيقات التكوين الأكثر شيوعًا حتى لا تضطر إلى تبديل المكتبات للتعامل مع التنسيقات المختلفة.
الهدف الآخر هو دعم أطر العمل المختلفة، لذلك لن تضطر مرة أخرى إلى تبديل المكتبات عند التعامل مع أطر عمل مختلفة. حاليًا يتم دعم Silex فقط باستخدام مزود خدمة، وسيتبع ذلك دعم Laravel وSymfony قريبًا.
من خلال واجهة برمجة التطبيقات البسيطة وخيارات التحميل البديهية، يحاول 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 موجودًا، فلن يؤدي إلى استثناء، على سبيل المثال:
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
بعد ذلك، سيكون كل من 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 ' ,
]);
سيستخدم كلاهما __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)
احصل على مورد محدد، أو قم بإرجاع مورد ملف أو خطأ إذا كان المورد غير موجود.
يعتمد اسم $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)
انظر الحصول على ()
الرجاء مراجعة سجل التغيير لمزيد من المعلومات عما تغير مؤخرًا.
$ composer test
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
إذا اكتشفت أي مشكلات متعلقة بالأمان، فيرجى إرسال بريد إلكتروني إلى [email protected] بدلاً من استخدام أداة تعقب المشكلات.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.