jasny / config
Requires
- php: >=7.1
- jasny/dotkey: ^1.0
- jasny/php-functions: ^3.3|^4.0
- psr/container: ^1.0
Requires (Dev)
- ext-json: *
- ext-mysqli: *
- ext-yaml: *
- aws/aws-sdk-php: ^3.2
- jasny/php-code-quality: 2.3.*
- nette/neon: ^2.3
- phpstan/phpstan: ^0.10.2
- phpstan/phpstan-strict-rules: ^0.10.1
- symfony/yaml: ^3.0
Suggests
- aws/aws-sdk-php: Required to load configuration from AWS DynamoDB
- nette/neon: Required to use the NEON notation
- symfony/yaml: To support YAML without the yaml php extension
README
配置您的应用程序。实现 PSR-11 以用作容器。
安装
Jasny Config 已在 Packagist 上注册为 jasny/config,并可以使用 composer 轻松安装。
composer require jasny/config
使用方法
use Jasny\Config; $config = (new Config()) ->load('settings.yml') ->load('settings.dev.yml', ['optional' => true]);
加载器
- Dir
- Ini
- Json
- Yaml
- Symfony
- Yaml 扩展
- Env
- DynamoDB
DelegateLoader
可以根据类名或文件扩展名选择加载器。
对于每个加载器;如果加载器无法加载设置,则抛出 Jasny\Config\LoadException
。
Dir
DirLoader
加载器将在目录中遍历每个文件。它使用文件名(不带扩展名)作为键名。
option | type | default | |
---|---|---|---|
recursive | bool | false | 递归遍历子目录 |
optional | bool | false | 如果目录不存在,则返回空配置 |
base_path | string | getcwd() | 相对路径的基础路径 |
Ini
IniLoader
使用 parse_ini_file
解析 INI 文件。
option | type | default | |
---|---|---|---|
process_sections | bool | false | 按节名称分组设置 |
mode | enum | INI_SCANNER_NORMAL | 解析选项的模式(关闭 = false 等) |
optional | bool | false | 如果文件不存在,则返回空配置 |
base_path | string | getcwd() | 相对路径的基础路径 |
Json
JsonLoader
使用 json_decode
解析 JSON 文件。
option | type | default | |
---|---|---|---|
optional | bool | false | 如果文件不存在,则返回空配置 |
base_path | string | getcwd() | 相对路径的基础路径 |
Yaml
YamlLoader
使用 yaml_parse
解析 YAML 文件。
option | type | default | |
---|---|---|---|
num | int | 0 | 从流中提取的文档(0 是第一个文档) |
callbacks | array | [] | YAML 节点的内容处理器 |
optional | bool | false | 如果文件不存在,则返回空配置 |
base_path | string | getcwd() | 相对路径的基础路径 |
如果已加载 yaml
扩展,则默认使用 YamlLoader
。
Symfony\Yaml
YamlSymfonyLoader
是 YAML 的一个替代加载器,使用 Symfony Yaml component。
option | type | default | |
---|---|---|---|
optional | bool | false | 如果文件不存在,则返回空配置 |
base_path | string | getcwd() | 相对路径的基础路径 |
在构建加载器时,可以传递 Symfony\Component\Yaml\Parser
对象。
use Symfony\Component\Yaml; $parser = new class() extends Yaml\Parser() { public function parse($value, $options = 0) { return parent::parseFile($value, $options | Yaml\Yaml::PARSE_CONSTANT); } } $yamlLoader = new YamlSymfonyLoader($options, $parser);
Env
EnvLoader
将环境变量映射到设置。在映射中,设置键支持点表示法。
option | type | default | |
---|---|---|---|
map | array | (required) | 从环境名称到设置键的键值对 |
示例
$map = [ "APP_SECRET" => "secret", "APP_DATABASE_PASSWORD" => "db.password" ]; $config->load('env', ['map' => $map]);
DynamoDB
DynamoDBLoader
允许从 AWS DynamoDB 数据库中加载设置。它期望所有设置都位于单个条目中。它将不会执行表扫描。默认情况下,整个条目被视为设置。或者,使用 settings_field
选项指定一个持有设置的 Map 字段。
option | type | default | |
---|---|---|---|
表 | string | (required) | DynamoDB 表名 |
key_field | string | 'key' | 索引字段(通常是主索引) |
key_value | string | (required) | 用于选择条目的值 |
settings_field | string | null | 在包含设置的条目内 |
示例
$dynamodb = Aws\DynamoDb\DynamoDbClient::factory([ 'region' => 'eu-west-1', 'version' => '2012-08-10' ]); * $config = new Jasny\Config(); $config->load($dynamodb, [ 'table' => 'config', 'key_field' => 'key', 'key_value' => 'myapp' ]);
DelegateLoader
DelegateLoader
是一个包含加载器的映射,可以自动根据文件扩展名或类名选择加载器。
默认情况下,它包含此库的所有加载器。您可以通过依赖注入传递一个加载器数组。
use Jasny\Config\Loader; $loader = new Loader\DelegateLoader([ 'yaml' => new Loader\YamlLoader(['base_path' => __DIR__ . '/config']), 'json' => new Loader\JsonLoader(['base_path' => __DIR__]) ]); $config = new Config([], $loader); $config->load('composer.json'); $config->load('settings.yml');
Config
Config
对象是一个动态对象;设置作为公共属性添加。它扩展了 stdClass
对象。
在构造时,您可以传递关联数组或 stdClass
对象作为设置。
$config = new Jasny\Config([ 'foo' => 'bar', 'db' => [ 'host' => 'localhost', 'username' => 'root', 'password' => 'god' ] ]);
可选地,您可以传递一个加载器。如果您的配置仅存在于 JSON 文件中,请考虑传递 JsonLoader
。这可以节省创建 DelegateLoader 和其他文件类型的加载器。
load()
从文件或其他数据源加载新设置并将其添加到配置中。
load(string|object $source, array $options = [])
这是一个流畅的接口,因此该方法返回 $this
。
示例
$config = (new Config()) ->load('composer.json') ->load('config/settings.yml') ->load($dynamoDB, ['table' => 'config', 'key_value' => 'myapp']);
merge()
将一个或多个 Config
(或 stdClass
)对象合并到配置中。
merge(stdClass $settings, ...)
这是一个流畅的接口,因此该方法返回 $this
。
get()
Config
对象实现了 PSR-11 ContainerInterface
。该方法通过键在配置中查找设置。可以使用点表示法来获取子属性。
mixed get(string $key)
如果设置不存在,将抛出 Jasny\Config\Exception\NotFoundException
。
示例
$config->get('foo'); // bar $config->get('db.host'); // localhost // throws a NotFoundException $config->get('something_random');
has()
has
方法是 PSR-11 ContainerInterface
的一部分。它检查设置是否存在。与 get()
类似,键支持点表示法。
bool has(string $key)
saveAsScript() / loadFromScript()
saveAsScript()
方法使用 var_export
创建变量的可解析字符串表示形式,并将其存储为 PHP 脚本。
如 500x faster caching 文章中所述,将解析后的配置存储为 PHP 脚本可以使加载它更快。
loadFromScript()
方法可以用于加载设置。建议使用此函数而不是仅仅使用 file_exists
和 include
,因为检查文件存在总是会击中文件系统。此函数首先检查 opcode 缓存。
$config = Config::loadFromScript('tmp/settings.php'); if (!isset($config)) { $config = (new Config()) ->load('composer.json') ->load('config/settings.yml'); $config->saveAsScript('tmp/settings.php'); }