4slv/yaml-config

从yaml配置生成配置代码

维护者

详细信息

github.com/4slv/yaml-config

源代码

v1.1.7 2019-04-29 07:44 UTC

README

  • 该模块允许从yaml文件生成面向对象的配置代码。

例如,从 yaml文件

family: # семья
  father: # отец
    name: Bob # имя
    hobby: # хобби
      - sport # спорт
      - boardgames # настольные игры
    story: | # биография
      родился в Бафало: # место рождения
      учился в церковно-приходской школе
  doter: # дочь
    name: Mila # имя
    age: # возраст
      '2017-04-17': 0
      '2018-04-17': 1
      '2019-04-17': 2
  • 模块将生成php代码,该代码将允许以面向对象的方式访问配置值
$config = new Config($date);
$fatherName = $config
    ->getFamily()
    ->getFather()
    ->getName();

变量 $fatherName 将包含值 Bob.

  • 模块允许创建具有有限期限的属性,例如,在上面的 yaml文件 中对属性 family.doter.age 的访问将取决于传递给构造函数的日期
$dateList = [
    '2018-04-17',
    '2019-09-12',
    '2017-09-01'
];
foreach($dateList as $date){
    $dateTime = new DateTime($date);
    $config = new Config($dateTime);
    $doterAgeList[] = $config
        ->getFamily()
        ->getDoter()
        ->getAge();
}

变量 $doterAgeList 包含数组:[1,2,0]

  • 生成的php代码将包含与yaml文件中注释对应的phpDoc注释

如何使用

use YamlConfig\ClassCodeGenerator\ConfigClassTreeGenerator;
use YamlConfig\YamlFileToTree;

$configGenerator = new ConfigClassTreeGenerator();
$yamlFileToTree = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
$yamlFileToTree
    ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
$configGenerator
    ->setProjectPath($rootDir) // путь к папке проекта
    ->setYamlFileToTree($yamlFileToTree) // объект преобразователь конфигурационного файла в конфигурацию
    ->setConfigCodeRelativePath($organizationsCodeRelativePath) // относительный путь к папке в которой будут сгенерирован код конфига
    ->setConfigName('Family') // название класса конфига
    ->setConfigNamespace('Config\Family') // пространство имён конфига
    ->generate(); // Генерация кода конфига

函数 generate 的特性

  1. 如果与原始配置(与生成的代码相比)没有变化,则不会进行重新生成。
  2. generate 作为可选参数接受一个函数,该函数将在生成代码后被调用。

接口

使用该模块可以生成配置类的接口。

  1. 层次接口.

    yaml的结构与yaml配置相对应。例如,以下yaml

    family: # семья
     father: # отец
       name: Bob # имя
       hobby: # хобби 
         - sport # спорт
         - boardgames # настольные игры
       story: | # биография
         родился в Бафало: # место рождения
         учился в церковно-приходской школе
     doter: # дочь
       name: Mila # имя
       age: # возраст
         '2017-04-17': 0
         '2018-04-17': 1
         '2019-04-17': 2

    将在最高层次创建接口

    <?php
    
    namespace Config\Interfaces\Family;
    
    use YamlConfig\InterfaceCodeGenerator\InterfaceConfigNode;
    use Config\Interfaces\Family\Family\Father;
    use Config\Interfaces\Family\Family\Doter;
    
    
    interface Family extends InterfaceConfigNode {
    
       /** @return Father отец */
       public function getFather();
       
       /** @return Doter дочь */
       public function getDoter();
    
    }

    在下一层次将存在接口Father和Doter。例如,Doter接口

    <?php
    
    namespace Config\Interfaces\Family\Family;
    
    use YamlConfig\InterfaceCodeGenerator\InterfaceConfigNode;
    
    
    interface Doter extends InterfaceConfigNode {
    
       /** @return string отец */
       public function getName();
       
       /** @return int дочь */
       public function getAge();
    
    }

    生成接口的代码与生成配置的代码非常相似。如下所示

    <?php
    
    use YamlConfig\InterfaceCodeGenerator\ConfigInterfaceTreeGenerator;
    use \YamlConfig\YamlFileToTree;
    
    $configInterfaceTreeGenerator = new ConfigInterfaceTreeGenerator();
    $yamlFileToTree = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
    $yamlFileToTree
       ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
    $configInterfaceTreeGenerator
       ->setProjectPath($rootDir)  // путь к папке проекта
       ->setYamlFileToTree($yamlFileToTreeInterface) // объект преобразователь конфигурационного файла в конфигурацию
       ->setConfigCodeRelativePath($organizationsCodeRelativePath) // относительный путь к папке в которой будут сгенерирован код конфига
       ->setConfigName('Family') // название класса конфига
       ->setConfigNamespace('Config\Interfaces\Family') // пространство имён конфига
       ->generate();
  2. 列表形式的接口描述.

    yaml结构的示例

    family_member: # Наименование интерфейса(Комментарий будет использоваться как комментарий к интерфейсу)
     xpath: # Список xpath к элементам которые будут его реализовывать
       - /family/*[name]
     property: # Список свойств указывается для указания геттеров для них
       name: # наименование свойства (Комментарий будет использоваться как комментарий к гетерру)
         type: string #тип свойства
    family_father: # Наименование интерфейса 
     xpath: # Список xpath к элементам которые будут его реализовывать
        - /family/father[name and hobby]
     property:
       hobby: # наименование свойства  
         type: string
       name: # наименование свойства
         type: string #тип свойства

    该yaml将创建2个接口

    <?php
    
    namespace Config\Interfaces\Family;
    
    use YamlConfig\InterfaceCodeGenerator\InterfaceConfigNode;
    
    /**
    * Наименование интерфейса(Комментарий будет использоваться как комментарий к интерфейсу)
    */
    interface FamilyMember extends InterfaceConfigNode {
    
       /** @return string наименование свойства (Комментарий будет использоваться как комментарий к гетерру) */
       public function getName();
    
    }
    <?php
    
    namespace Config\Interfaces\Family;
    
    use YamlConfig\InterfaceCodeGenerator\InterfaceConfigNode;
    
    /**
    * Наименование интерфейса
    */
    interface FamilyFather extends InterfaceConfigNode {
    
       /** @return string наименование свойства */
       public function getName();
    
       /** @return string наименование свойства */
       public function getHobby();
    
    }

    生成接口的代码

    <?php
    
    use YamlConfig\InterfaceCodeGenerator\ConfigInterfaceListTreeGenerator;
    use \YamlConfig\YamlFileToTree;
    
    $configInterfaceTreeGenerator = new ConfigInterfaceListTreeGenerator();
    $yamlFileToTree = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
    $yamlFileToTree
       ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
    $configInterfaceTreeGenerator
       ->setProjectPath($rootDir)  // путь к папке проекта
       ->setYamlFileToTree($yamlFileToTreeInterface) // объект преобразователь конфигурационного файла в конфигурацию
       ->setConfigCodeRelativePath($organizationsCodeRelativePath) // относительный путь к папке в которой будут сгенерирован код конфига
       ->setConfigName('Family') // название класса конфига
       ->setConfigNamespace('Config\Interfaces\Family') // пространство имён конфига
       ->generate();
  3. 将接口连接到配置对象
    <?php
    use YamlConfig\ClassCodeGenerator\ConfigClassTreeGenerator;
    use YamlConfig\YamlFileToTree;
    
    $configGenerator = new ConfigClassTreeGenerator();
    $yamlFileToTree = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
    $yamlFileToTree
       ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
    $yamlFileToTreeHierarchicalInterface = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
    $yamlFileToTreeHierarchicalInterface
       ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
    $yamlFileToTreeDescribedInterfaces = new YamlFileToTree(); // объект преобразователь конфигурационного файла в конфигурацию
    $yamlFileToTreeDescribedInterfaces
       ->setConfigRelativePath($organizationsRelativePath); //относительный путь расположения yaml-файл с настройками
    $configGenerator
       ->setProjectPath($rootDir) // путь к папке проекта
       ->setYamlFileToTree($yamlFileToTree) // объект преобразователь конфигурационного файла в конфигурацию
       ->setConfigCodeRelativePath($organizationsCodeRelativePath) // относительный путь к папке в которой будут сгенерирован код конфига
       ->setConfigName('Family') // название класса конфига
       ->setConfigNamespace('Config\Family') // пространство имён конфига
       ->setYamlFileToTreeHierarchicalInterfaces($yamlFileToTreeHierarchicalInterface) // преобразователь конфигурационного файла в конфигурацию для иерархических интерфейсов 
       ->setYamlFileToTreeDescribedInterfaces($yamlFileToTreeDescribedInterfaces) // преобразователь конфигурационного файла в конфигурацию для описанных интерфейсов
       ->setConfigHierarchicalInterfacesNamespace('Config\Interfaces\HierarchicalInterface') // пространство имён иерархических интерфейсов для узлов конфига
       ->setConfigDescribedInterfacesNamespace('Config\Interfaces\DescribedInterfaces') //  пространство имён описанных интерфейсов для узлов конфига
       ->generate(); // Генерация кода конфига

    此代码生成的Father类的示例

    <?php
    
    namespace Config\Family\Family;
    
    use YamlConfig\InterfaceCodeGenerator\InterfaceConfigNode;
    use Config\Interfaces\HierarchicalInterface\Family\Family\Father as FatherInterface;
    use Config\Interfaces\DescribedInterfaces\FamilyFather as FamilyFatherInterface;
    use use Config\Interfaces\DescribedInterfaces\FamilyMember as FamilyMemberInterface;
    
    /**
    * Наименование интерфейса
    */
    class Father extends InterfaceConfigNode implements FatherInterface, FamilyFatherInterface, FamilyMemberInterface
    {
    
       /** @return string наименование свойства */
       public function getName()
       {
           return $this->getActualProperty('name');
       }
    
       /** @return string наименование свойства */
       public function getHobby()
       {
           return $this->getActualProperty('hobby');
       }
    
    }