En inspiration d'une précédente réalisation, pour le fun et mon usage, j'ai codé un système de config.
Qu'a-t-il de particulier pour nécessiter une nouvelle lib ?
- il sait parser des expressions comme
%env(VAR:value)%
- ces expressions peuvent être imbriquées
- il peut être enrichi de "processors", ex.
%enforce(int:%(db.port)%)%
- il sait réduire la config par environnement, mais aussi par machine (pour ceux qui ne sont pas passés aux conteneurs)
Chaque notion a été découplée pour permettre d'utiliser chaque élément séparément pour construire son propre système custom.
- Parser : s'occupe du parsing des expressions.
- Processor : enrichissement du parsing.
- Compiler : réduit la configuration en plusieurs passes.
- Dumper : écrit la configuration dans des fichiers.
Une classe Appcfg
a été créée comme helper pour les cas d'usage basiques, ex :
(new \Arnapou\Appcfg\Appcfg())
->autoload(
source: [
'db' => [
'main' => [
'host' => 'localhost',
'port' => 3306,
'name' => 'project_main',
'password' => 'project_password',
],
'data' => [
'host' => '%(db.main.host)%',
'port' => '%(db.main.port)%',
'name' => 'project_data',
'password' => '%(db.main.password)%',
],
],
'db|prod' => [
'main' => [
'password' => '%env(DB_PASSWORD)%',
],
],
],
filename: __DIR__ . '/cache/config.php',
class: MyApp\Config::class,
environment: 'prod',
);
Le dumper fournit produit des classes php fortement typées, possiblement immutables, ex :
namespace MyProject;
final readonly class ConfigDbMain
{
public function __construct(
public string $host = 'localhost',
public int $port = 3306,
public string $name = 'project_main',
public string $password = '123456',
) {}
}
final readonly class ConfigDbData
{
public function __construct(
public string $host = 'localhost',
public int $port = 3306,
public string $name = 'project_data',
public string $password = '123456',
) {}
}
final readonly class ConfigDb
{
public function __construct(
public ConfigDbMain $main = new ConfigDbMain(),
public ConfigDbData $data = new ConfigDbData(),
) {}
}
final readonly class Config
{
public function __construct(
public ConfigDb $db = new ConfigDb(),
) {}
}
Détails
Pour plus de détails techniques, allez voir le README sur Gitlab.