Skip to content

nope7777/configs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

About

GitHub Workflow Status

Usually configuration files in PHP projects stored in PHP files as arrays or in YAML files. I see few cons in this approach:

  • In case you need some configurations in your service, you must inject all configurations.
  • Structure on those configurations not amenable to static analysis.

This small library offers a slightly different approach for organizing your configuration files.

Usual configuration file:

<?php

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

Used like this:

<?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;
    }
}

Can be transformed in to:

use N7\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()
    {
        // ...
    }
}

Now you are able to inject only needed configurations and structure of those configurations are completely transparent.

<?php

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

Documentation

Available methods:

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)

🥔

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages