iamsalnikov/config-builder

配置构建器

dev-master 2017-07-13 04:24 UTC

This package is not auto-updated.

Last update: 2024-09-24 17:52:47 UTC


README

Build Status

本库用于配置文件的构建。

1. 安装

composer require iamsalnikov/config-builder

2. 使用

定义基本概念

  1. PlaceholderProcessor 是一个组件,它会在需要构建的文件中查找模板。此外,此组件还会将模板替换为特定值。
  2. ValueProvider 是一个组件,它为请求的模板提供某个值。

2.1. 配置

在开始工作之前,需要配置构建器,使其知道如何提取模板,以及从何处获取这些模板的值。例如配置文件(config_builder.yaml)

# Определяем обработчики шаблонов. Их может быть несколько
placeholder_processors:
  # Просто имя, ничего не значит
  Basic:
    # Класс обработчика. Можно определить свой (об этом будет рассказано ниже)
    class: iamsalnikov\ConfigBuilder\PlaceholderProcessors\BasicProcessor
    # Список аргументов для конструктора обработчика. В данном примере
    # первый аргумент - левая граница плейсхолдера
    # второй аргумент - правая граница плейсхолдера
    arguments:
      - "{{"
      - "}}"

# Определим провайдеры значений для плейсхолдеров (все будут описаны ниже)
# Значения получаем из провайдеров, определенных по порядку. Если в первом провайдере
# значение не найдено, то попробуем его найти в следующем. И так до самого конца списка
# провайдеров
value_providers:
  # Просто имя, ничего не значит
  YamlProvider:
    # Класс провайдера. Можно определить свой (об этом будет рассказано ниже)
    class: iamsalnikov\ConfigBuilder\ValueProviders\Yaml
    # Список аргументов для конструктора провайдера. В данном случае - путь до файла со значениями
    arguments:
      - /var/www/placeholders/data.yaml
      
  Environment:
    class: iamsalnikov\ConfigBuilder\ValueProviders\Environment
    arguments:
      - PRF_

2.2. 运行

要运行,需要执行以下命令

vendor/bin/config_builder path/to/config.php

在这种情况下,将尝试在当前活动目录中查找配置文件(config_builder.yaml)。之后将读取文件 path/to/config.php,并将所有占位符替换为来源中的值。

如果构建器的配置不在其他位置,可以使用选项 -c 或 --config 传递配置路径

vendor/bin/config_builder -c path/to/config_builder.yaml path/to/config.php

运行结果输出到 stdout。如果需要将所有内容保存到文件,可以使用输出重定向

vendor/bin/config_builder path/to/config.example.php > path/to/config.php

3. 模板名称

每个模板通常在开头和结尾有限定的框架。例如:{{db.host}}。在本例中,模板名称为 db.host

在名称中,我们可以使用嵌套,如果需要从数组中获取值。我们使用点(.)分隔级别。也可以使用数字索引。

4. 模板处理器

每个模板处理器都必须实现接口 iamsalnikov\ConfigBuilder\Interfaces\PlaceholderProcessor。

目前只有一个模板处理器 - iamsalnikov\ConfigBuilder\PlaceholderProcessors\BasicProcessor。其构造函数接受两个参数:占位符的左边界和右边界。

5. 值提供者

每个值提供者都实现了接口 iamsalnikov\ConfigBuilder\Interfaces\ValueProvider。

目前有三个值提供者

  1. iamsalnikov\ConfigBuilder\ValueProviders\Environment - 从环境变量中获取值。

构造函数接受一个可选参数:环境变量的前缀。

使用嵌套的模板名称(例如,db.host)将被转换为 DB_HOST。如果设置了前缀,例如 GG_,则模板的值将在环境变量 GG_DB_HOST 中查找。

  1. iamsalnikov\ConfigBuilder\ValueProviders\Json - 从 json 文件中获取值。

构造函数接受一个必需参数:值文件的路径。如果路径不是绝对路径,则它将被计算为包含构建器配置的文件夹的相对路径。

使用第 3 点中的语法获取嵌套值(db.host,user.0.email)。

  1. iamsalnikov\ConfigBuilder\ValueProviders\Yaml - 与 Json 提供者类似,但使用 yaml 文件。

始终可以定义自己的数据提供者并使用它

可以有许多数据提供者。在这种情况下,我们将为模板查找值,直到某个提供者提供一些值,或者直到到达提供者列表的末尾。

6. 工作示例

我们有配置文件 /var/www/config_builder.yaml

placeholder_processors:
  Basic:
    class: iamsalnikov\ConfigBuilder\PlaceholderProcessors\BasicProcessor
    arguments:
      - "{{"
      - "}}"

value_providers:
  YamlProvider:
    class: iamsalnikov\ConfigBuilder\ValueProviders\Yaml
    arguments:
      - placeholders/data.yaml # файл будет найден в /var/www/placeholders/data.yaml
      
  Environment:
    class: iamsalnikov\ConfigBuilder\ValueProviders\Environment
    arguments:
      - PRF_

来自文件 /var/www/placeholders/data.yaml 的数据

db:
  host: localhost
  port: 3306
  dbName: hello
  user: user
  password: superpassword

环境变量 PRF_DB_SECURITY_KEY="securnost"

模板文件内容(config.php)

<?php

return [
    'db' => [
      'connectionString' => 'mysql:{{db.host}}:{{db.port}}/{{db.dbName}}',
      'user' => '{{db.user}}',
      'password' => '{{db.password}}',
      'encryptionKey' => '{{db.securityKey}}'
    ]
];

执行命令

vendor/bin/config_builder config.php

获得输出

<?php

return [
    'db' => [
      'connectionString' => 'mysql:localhost:3306/hello',
      'user' => 'user',
      'password' => 'superpassword',
      'encryptionKey' => 'securnost'
    ]
];