jorpo/environment

面向对象方式的环境管理

dev-master 2021-11-24 17:05 UTC

This package is auto-updated.

Last update: 2024-09-24 23:40:06 UTC


README

此包可以用作 new Environment($_SERVER);,以轻松地将配置传递到面向对象应用程序中。

然而,我们都知道应用程序配置可能比这更具挑战性。为了提供尽可能的灵活性,此包实现了一种责任链模式,允许多层次的简单或复杂数据操作,以构建满足任何需求的应用程序环境。

以下是一个详细的示例

<?php declare(strict_types=1);

use Jorpo\Environment\Factory\FilterChain\ConvertBooleansFilter;
use Jorpo\Environment\Factory\FilterChain\DotEnvFileFilter;
use Jorpo\Environment\Factory\FilterChain\FileObjectsFilter;
use Jorpo\Environment\Factory\FilterChain\FilterChain;
use Jorpo\Environment\Factory\FilterChain\GetEnvFilter;
use Jorpo\Environment\Factory\FilterChain\LimitByKeyFilterChain;
use Jorpo\Environment\Factory\FilterChain\LowercaseKeysFilter;
use Jorpo\Environment\Factory\FilterChain\MergeArrayFilter;
use Jorpo\Environment\Factory\FilterChain\NestArraysByKeyFilter;
use Jorpo\Environment\Factory\FilterChain\ParseUrlsFilter;
use Jorpo\Environment\Factory\FilterChainFactory;

$factory = new FilterChainFactory(new FilterChain(

    // Load all env variables from selected .env sources
    // This filter chain set will merge and overwrite values from previous fiters
    new FilterChain(
        new DotEnvFileFilter(new SplFileInfo(__DIR__ . '/../.env.defaults')),
        new DotEnvFileFilter(new SplFileInfo(__DIR__ . '/../.env')),
        new MergeArrayFilter($_SERVER),
        new GetEnvFilter
    ),

    // Apply some basic transformations
    new LowercaseKeysFilter,
    new ConvertBooleansFilter,

    // Deal with paths and files.
    // You could use these example filters to implement Flysystem file loading!
    new FilterChain(
        $pathFilter = new KeyEndsWithFilterChain('path', new FileObjectsFilter),
        $fileFilter = new KeyEndsWithFilterChain('file', new FileObjectsFilter),
        new LimitByKeyFilterChain(
            'paths',
            $pathFilter,
            $fileFilter
        )
    ),

    // Deal with URLs and URIs etc
    new FilterChain(
        new KeyEndsWithFilterChain('url', new ParseUrlsFilter),
        new KeyEndsWithFilterChain('uri', new ParseUrlsFilter),
        new KeyEndsWithFilterChain('urn', new ParseUrlsFilter),
    ),

    // Nest known keys for tidier access
    new NestArraysByKeyFilter(
        'amqp',
        'auth',
        'database',
        'logging',
        'slim'
    ),

    // For database access nest again
    new KeyStartsWithFilterChain(
        'database',
        new NestArraysByKeyFilter(
            'system', 'tenant',
        )
    )
));

$environment = $factory->make();

待办事项

  • 添加对 Yaml 的支持?
  • ini 文件支持?

当然,有一些更好的、更整洁、更通用的方法来做这些过滤器,这些将在某一天得到解决。