非常简单的配置

v1.1 2021-05-10 21:24 UTC

README

Latest Stable Version Build Status Minimum PHP Version License Total Downloads Scrutinizer Code Quality Code Coverage

关于此包

这是一个非常简单的配置包。使用它来初始化并访问您的PHP应用程序中的配置设置。

简洁、经过测试、从PHP 7.3开始支持,并且不会向您的代码库添加任何其他依赖项。

要求

  • PHP 7.3(或更高版本)

是的,就是这样。

安装

通过composer

$ composer require carstenwindler/config

为什么还需要另一个配置包?

这个包最初是一个更简单的配置类,我将其添加到项目中一次,并且一直在使用和改进它。添加一些点,我决定将其发布为包。当然,使用其他(更大的)包肯定有很好的理由,但如果您只需要一个不会给您的项目添加任何开销的配置类,这可能是一个正确的选择。

级联配置

这个Config包背后的基本思想是“级联配置”的概念:您不是一次性加载整个配置,而是逐步构建。

main.php
\- environment/develop.php
 \- markets/my_market.php

您从一个“主配置”开始,它包含所有目的的基本配置,然后根据您所处的环境添加更多(或覆盖以前的)配置。例如,在本地开发环境中,您可能希望使用与生产环境不同的Web服务版本。

简单的“数组点”表示法

使用“数组点”表示法来指定配置项(例如'lvl1.lvl2.lvl3.foo')是最快、最简单的方法。

但这有一个很大的缺点——配置使用字符串来指定,这很容易导致“腐烂的配置”。请查看下面的“严格模式”部分了解如何解决这个问题。

用法

初始化

有三种方法可以设置配置。

从文件加载

通常,应用程序配置简单地存储在文件中,因此这是Config的标准用例。

Config仅使用PHP数组作为唯一的配置格式。要将数组存储在文件中,您可以使用此表示法,例如

<?php

return [
    'my_config' => [
        'key1' => 'value1',
        'key2' => 'value2',
    ]
];

为什么只使用PHP数组?因为它们简单、强大、快速并且支持良好。如果您想或需要以例如YAML格式存储配置,您需要自己添加该功能,例如通过加载YAML并将其转换为数组,然后将其传递给Config。

// load config from file with full path
$config = (new Config)->addConfigFile('/app/root/config/main_config.php');
// set the folder /app/root/config as your configuration folder
$config = (new Config)->setConfigPath('/app/root/config');
// load config from file /app/root/config/main_config.php
$config->addConfigFile('main_config.php');
// additionally, merge the config from /app/root/config/environment/develop.php
$config->addConfigFile('environment/develop.php');

从数组加载

通常,您会使用这种方法在测试期间设置配置。

$myConfiguration = [
	'key' => 'value'
];

$config = (new Config)->addConfigArray($myConfiguration);

$myOtherConfiguration = [
	'key2' => 'value2'
];

$config->mergeConfig($myOtherConfiguration);

直接设置配置

通常,您会使用这种方法在测试期间设置配置。

$config = (new Config)->set('my.config.value.one', 12345);

在运行时检索和操作配置

$myConfiguration = [
    'lvl1' => [
        'test' => 'value',
        'lvl2' => [
            'foo' => 'wrong',
            'lvl3' => [
                'foo' => 'baz',
            ]
        ],
    ],
];

$config = (new Config)->setConfigArray($myConfiguration);

echo $config->get('lvl1.lvl2.lvl3.foo'); // echoes "baz"
echo $config->set('lvl1.lvl2.foo', 'bar');
echo $config->get('lvl1.lvl2.foo'); // echoes "bar"

如果您希望所需的值不存在,可以指定默认值

echo $config->get('lvl1.lvl2.lvl3.nope', 'foo'); // echoes "foo"

否则,返回值将为null

is_null($config->get('lvl1.lvl2.lvl3.nope')); // true

请参阅下面的“严格模式”部分以获取更多选项!

严格模式

为了避免在代码库中使用不存在的配置项,您可以打开“严格模式”。如果所需的值不存在,Config将抛出异常而不是返回null。

这可以揭示配置中的问题,但是您**不应在生产环境中启用它**。它主要用于本地或CI构建。

故障排除

  1. 没有开箱即用的yml支持?你在开玩笑吗?不。Yml是一个很好的格式,但您可能不需要在项目中使用它。您仍然可以使用YAML加载器(如mustangostang/spyc)将yml加载为数组,并将其传递给Config。

待办事项

  1. 对函数名称进行对齐(例如,add() 和 mergeConfig() 基本上执行相同的操作,只是来源不同)