openclassrooms/code-generator

v2.0.0-alpha 2021-06-28 15:39 UTC

README

Build Status SensioLabsInsight Coverage

CodeGenerator 是一个在 Clean Architecture 环境中生成类的库。

从任何用例响应中,开发者都可以生成

  • 通用用例架构
  • 实体用例获取架构
  • 实体用例获取架构
  • 创建实体用例架构
  • 删除实体用例架构
  • ViewModel 架构
  • 控制器和模型类
  • 为每个生成的类创建单元测试

安装

安装 CodeGenerator 最简单的方式是通过 composer

创建以下 composer.json 文件或运行 php composer.phar install 命令来安装。

composer require --dev openclassrooms/code-generator *

{
    "require": {
        "openclassrooms/code-generator": "*"
    }
}

composer.json 的脚本部分设置 post-install 和 post-update 钩子,以生成默认配置的 oc_code_generator.yml 文件。此文件对于代码生成器的运行是必需的。

{
  "scripts": {
    "post-install-cmd": [
      "OpenClassrooms\\CodeGenerator\\Composer\\ParameterHandler::createGeneratorFileParameters"

    ],
    "post-update-cmd": [
      "OpenClassrooms\\CodeGenerator\\Composer\\ParameterHandler::createGeneratorFileParameters"
    ]
  }
}

该脚本将在项目的根目录创建一个名为 oc_code_generator.yml 的文件,并会交互式地询问缺失的参数,使用 dist 文件中的值作为默认值,如下所示

parameters:
    api_dir: 'ApiBundle\'
    app_dir: 'AppBundle\'
    base_namespace: 'OC\'
    stub_namespace: 'Doubles\OC\'
    tests_base_namespace: 'OC\'
    
    entity_util_classname: 'OC\Util\EntityUtil'
    
    security_classname: 'OpenClassrooms\UseCase\Application\Annotations\Security'
    transaction_classname: 'OpenClassrooms\UseCase\Application\Annotations\Transaction'
    use_case_classname: 'OpenClassrooms\UseCase\BusinessRules\Requestors\UseCase'
    use_case_request_classname: 'OpenClassrooms\UseCase\BusinessRules\Requestors\UseCaseRequest'
    
    paginated_collection_builder_impl: 'OpenClassrooms\UseCase\Application\Entity\PaginatedCollectionBuilderImpl'
    paginated_collection_classname: 'OC\BusinessRules\Entities\PaginatedCollection'
    paginated_collection_factory: 'OC\AppBundle\Repository\PaginatedCollectionFactory'
    paginated_use_case_response_classname: 'OC\BusinessRules\Responders\PaginatedUseCaseResponse'
    paginated_use_case_response_builder_classname: 'OC\BusinessRules\Responders\PaginatedUseCaseResponseBuilder'
    use_case_response_classname: 'OC\BusinessRules\Responders\UseCaseResponse'
    pagination_classname: 'OC\BusinessRules\Gateways\Pagination'
    
    abstract_controller : 'OC\ApiBundle\Framework\FrameworkBundle\Controller\AbstractApiController'
    collection_information : 'OC\ApiBundle\ParamConverter\CollectionInformation'

您可能需要根据您使用的项目调整这些值。

使用方法

基本执行

列出所有命令

php bin/code-generator

生成视图模型架构

php bin/code-generator code-generator:view-models useCaseResponseClassName

生成通用用例架构

php bin/code-generator code-generator:generic-use-case
or  
php bin/code-generator code-generator:generic-use-case Domain\\SubDomain UseCaseName

生成实体 CRUD 用例架构

# Create:
php bin/code-generator code-generator:create-entity-use-case EntityClassName
# Delete: 
php bin/code-generator code-generator:delete-entity-use-case EntityClassName
# Edit:
php bin/code-generator code-generator:edit-entity-use-case EntityClassName
# Get all:
php bin/code-generator code-generator:get-entities-use-case EntityClassName
# Get:
php bin/code-generator code-generator:get-entity-use-case EntityClassName

扩展

无测试生成

php bin/code-generator code-generator:view-models useCaseResponseClassName --no-test

仅当视图模型类已存在时生成视图模型架构测试

php bin/code-generator code-generator:view-models useCaseResponseClassName --tests-only

为视图模型类生成预览

php bin/code-generator code-generator:view-models useCaseResponseClassName --dump

在 PHPStorm 中使用代码生成器

您可以在 PHPStorm 中设置外部工具条目,以便通过在项目树中的类(例如,实体类)上右键单击来从 IDE 运行一些代码生成器命令。

对于通用用例生成,添加一个外部工具条目,如下所示

程序: /usr/local/bin/php 参数: bin/code-generator code-generator:generic-use-case 工作目录

对于获取实体用例生成,添加一个外部工具条目,如下所示

程序: /usr/local/bin/php 参数: bin/code-generator code-generator:get-entity-use-case 工作目录

请注意,这只有在代码生成器在项目的 composer.json 中正确设置的情况下才会工作。您可能需要根据您本地的 PHP 二进制路径进行调整。

如何创建一个新的生成器

要了解

  • 在骨架目录中,通过骨架描述生成文件。
  • 生成器获取数据并将其发送到骨架(就像网页一样)。
  • 生成器必须只生成一个文件。
  • 中介负责调用不同的生成器。
  • 中介可以调用许多其他中介。
  • 命令必须调用中介。
  • 每个类必须有一个接口及其实现。
  • FileObject 包含生成文件所需的所有类信息。
  • 工厂用于从领域和实体名称创建 FileObject。
  • 实体名称和领域从 ClassNameUtility 特性中获取。
  • 如果您在生成器中需要其他类信息,请使用工厂创建所需的 FileObject。
  • 一些实用类用于生成存根、常量和其他内容。
  • 在视图模型命令中,如果使用情况响应类的名称包含基本命名空间,生成器在需要时使用它。

方法论

1) 编写要生成的文件模板

首先,您必须为生成后预期的文件创建twig模板。

2) 创建生成器RequestDTO和生成器RequestBuilder

创建一个类,其名称以RequestBuilder结尾,这用作生成器主方法中的参数。

3) 启动生成器实现

生成器类的主要目标是生成预期的FileObject,但要成功,需要从工厂构建其他FileObject并使用可用的实用工具。

4) 创建生成器测试

创建一个以GeneratorTest结尾的类和相关的存根类(以FileObjectStub1结尾的实体名称)。存根必须包含用于与实际对象比较的预期值。

5) 创建skeletonModel和SkeletonModelAssembler

创建两个类,都以前缀实体名称开始

  • 首先是一个抽象类SkeletonModel
  • 其次SkeletonModelAssembler,两者都用于创建将在模板中使用的对象。

6) 创建中介或向现有中介添加生成器

该命令使用中介模式根据功能组生成类。将新生成器添加到相关组并更新中介配置。

7) 创建配置文件并更新services.xml

为生成器创建一个新的.xml文件并将其添加到src/Resources/config/service.xml

8) 如果不存在,则创建命令

src/Commands中创建您的命令,并在execute方法中调用中介的mediate函数。

查看示例

对于实际示例,检查如何构建src/Generator/ViewModelGenerator.php