vshf/php-config

处理应用设置的PHP配置系统

v1.0.5 2023-06-14 17:04 UTC

This package is not auto-updated.

Last update: 2024-10-02 23:32:47 UTC


README

VSHF PHP配置管理器是PHP应用的设置/配置管理器。它提供处理设置和具有其属性的资源的功能。

用法

要使用VSHF配置管理器,您需要实例化Config

$settings = new \VSHF\Config\Config();

您还可以使用设置初始化它

$settings = new \VSHF\Config\Config([
   'setting1' =>'value1',
   'setting2' =>'value2'
]);

上下文

默认设置上下文是app上下文。在初始化时添加设置。

您可以在稍后填充不同的上下文

$settings->hydrate(
    [
        'settingA' =>'valueA',
        'settingB' =>'valueB'
    ],
    'myContext'
);

这将创建一个以下结构的内部设置树

[
    'app' => [
        'setting1' =>'value1',
        'setting2' =>'value2'
    ],
    'myContext' =>[
        'settingA' =>'valueA',
        'settingB' =>'valueB'
    ]
]

资源和属性

在具有资源集合及其属性的情况下,属性可以被认为是每个资源的设置,您可以使用配置管理器来处理它们。

例如,如果您有一个包含服务isPriced属性的集合,您可以观察不同服务中此属性的值。

[
    'service_1' => [
        'isPriced' => FALSE,
        ...
    ],
    'service_2' => [
        'isPriced' => TRUE,
        ...
    ],
    ...
]

使用资源集合进行填充

foreach ($collection as $itemId => $item) {
    $settings->hydrateResource(
        [
             'isPriced' => TRUE,
             // other properties
        ],
        'services', // Context
        $itemId // Resource ID
    );
}

观察者

每个设置都必须有相应的观察者,该观察者实现了ObserverInterface。观察者可以处理一个或多个设置。

注册观察者

// In the main context:
$settings->registerObserver('settingId', MyObserver::class);


// In a custom context
$settings->registerObserver('settingId', MyObserver::class, 'myContext');

// Observing multiple settings with a single observer:
$settings->registerObserver('settingA', MyObserver::class);
$settings->registerObserver('settingB', MyObserver::class);

资源属性观察者

同样,每个资源属性都必须有相应的属性观察者,该观察者实现了PropertyObserverInterface。观察者可以处理一个或多个属性。

注册属性观察者

$settings->registerObserver('propertyId', MyPropertyObserver::class, 'services');

// Observing multiple properties with a single observer:
$settings->registerObserver('propertyA', MyPropertyObserver::class, 'services');
$settings->registerObserver('propertyB', MyPropertyObserver::class, 'services');

获取和保存

获取设置

// From the main context:
$settings->get('settingA');

// From a custom context:
$settings->get('settingA', 'myContext');

保存设置

// In the main context:
$settings->save('settingA', 'newValue');

// In a custom context:
$settings->save('settingA', 'newValue', 'myContext');

资源属性

检索给定资源的属性

$settings->getProperty('propertyA', 'services', 'resourceId');

保存给定资源的属性

$settings->saveProperty('propertyA', 'services', 'resourceId');

检索具有所有属性的给定资源

$settings->getResourceProperties('services', 'resourceId');

设置依赖

设置或资源属性可以依赖于一个或多个其他设置,甚至来自不同的上下文。

要设置依赖,观察者的dependencies()方法必须返回一个Dependency对象。

// Inside settingA's observer class
public static function dependencies(){
    $dependency = new \VSHF\Config\Dependency();
    $dependency
        ->on('settingB')
        ->beingEqualTo('certainValue')
        ;
    return $dependency;
}

在此示例中,如果settingB等于certainValue,则正确返回settingA。否则,返回NULL。

需要注意的是,NULL不应该是一个默认/适当的设置值。

复杂依赖

依赖可以是复杂的,涉及逻辑运算符如ANDOR。您可以使用Dependency对象构建复杂的依赖。

$dependency = new \VSHF\Config\Dependency();

// AND
$dependency
    ->on('settingB')
    ->beingEqualTo('certainValue')
    ->and('settingC')
    ->beingTruthy()
    ;
    
// OR
$dependency
    ->on('settingB')
    ->beingEqualTo('certainValue')
    ->or('settingC')
    ->beingTruthy()
    ;

//INVALID, triggers an error
$dependency
    ->on('settingB')
    ->beingEqualTo('certainValue')
    ->and('settingC')
    ->beingTruthy()
    ->or('settingD')
    ->beingFalsy()
    ;

/*
 * This is equal to:
 *      settingB === certainValue && (
 *          settingC || !settingD
 *      )
 */
$dependency
    ->on('settingB')
    ->beingEqualTo('certainValue')
    ->andGroup()
    ->on('settingC')
    ->beingTruthy()
    ->or('settingD')
    ->beingFalsy()
    ->endGroup()
    ;

/*
 * This is equal to:
 *      settingB === certainValue || (
 *          settingC && !settingD
 *      )
 */
$dependency
    ->on('settingB')
    ->beingEqualTo('certainValue')
    ->orGroup()
    ->on('settingC')
    ->beingTruthy()
    ->and('settingD')
    ->beingFalsy()
    ->endGroup()
    ;

许可

本项目是开源软件,根据MIT许可授权。