flavacaster/configs

配置文件组织库

v1.0.4 2022-06-13 18:47 UTC

This package is auto-updated.

Last update: 2024-09-13 23:43:23 UTC


README

GitHub Workflow Status

在PHP项目中,通常将配置文件存储为PHP数组文件或YAML文件。这种方法的缺点有:

  • 如果你需要在服务中使用某些配置,你必须注入所有配置。
  • 这些配置的结构不利于静态分析。

这个小型库为组织你的配置文件提供了一个稍微不同的方法。

常规配置文件

<?php

return [
    'application' => [
        'timezone' => env('APPLICATION_TIMEZONE', 'UTC'),
        'currency' => env('APPLICATION_CURRENCY', 'USD'),
    ],
    'storage' => [
        'driver' => env('STORAGE_DRIVER', 'local'),
        'drivers' => [
            'aws' => [
                // ...
            ],
            'local' => [
                // ...
            ],
        ],
    ],
];

使用方法

<?php

class LocalStorageAdapter
{
    private Config $config;
    
    public function __construct(Config $config)
    {
        $this->config = $config;
    }
    
    public function build()
    {
        // IDE's autocomplete not working for this line
        $this->config->storage->drivers->local;
    }
}

可以转换成

use Flavacaster\Configs\AbstractConfig;

class ApplicationConfiguration extends AbstractConfig
{
    private string $timezone;
    private string $currency;
    
    public function __construct()
    {
        $this->timezone = $this->env()->getString('APPLICATION_TIMEZONE', 'UTC');
        $this->currency = $this->env()->getString('APPLICATION_CURRENCY', 'USD');
    }
}

class StorageConfiguration extends AbstractConfig
{
    private string $driver;
    
    private array $drivers = [];
    
    // If you want you are able to inject nested configurations
    public function __construct(
        LocalStorageConfiguration $localStorageConfiguration,
        AwsStorageConfiguration $awsStorageConfiguration
    ) {
        $this->driver = $this->env()->getString('STORAGE_DRIVER', 'local');
        
        $this->drivers['local'] = $localStorageConfiguration;
        $this->drivers['aws'] = $awsStorageConfiguration;
    }
}

class LocalStorageConfiguration extends AbstractConfig
{
    // ...
    
    public function __construct()
    {
        // ...
    }
}

class AwsStorageConfiguration extends AbstractConfig
{
    // ...
    
    public function __construct()
    {
        // ...
    }
}

现在你可以仅注入所需的配置,并且这些配置的结构完全透明。

<?php

class LocalStorageAdapter
{
    private LocalStorageConfiguration $config;
    
    public function __construct(LocalStorageConfiguration $config)
    {
        $this->config = $config;
    }
    
    public function build()
    {
        $this->config;
    }
}

文档

可用方法

public function getBool(string $key, $default = null): bool
public function getNullableBool(string $key, $default = null): ?bool
public function getFloat(string $key, $default = null): float
public function getNullableFloat(string $key, $default = null): ?float
public function getInt(string $key, $default = null): int
public function getNullableInt(string $key, $default = null): ?int
public function getList(string $key, $default = []): array
public function getNullableList(string $key, $default = []): ?array
public function getString(string $key, $default = null): string
public function getNullableString(string $key, $default = null): ?string
public function getRaw(string $key)

🥔