lezhnev74/ddd-generator

适用于三层应用的 DDD 生成器

0.2.0 2019-08-08 04:49 UTC

This package is auto-updated.

Last update: 2024-09-09 01:48:55 UTC


README

GitHub license Build Status Scrutinizer Code Quality Code Coverage

三层应用 DDD 类生成器

在开发干净且解耦的应用时,您必须处理许多接口和对象。在 RAPID 开发流程中您有一个对象,而在 DDD 流程中您有大量的对象。为了加快速度,我使用这个工具来生成与 ServiceBus 模式、CQRS 模式和 Clean Architecture 相关的原始代码。如果您感兴趣 - 我在博客中写了关于这个生成器背后的想法

注意:我使用 PSR-4,因此任何文件夹继承都会导致命名空间继承(反之亦然)。另外,斜杠类型无关紧要 - \ 和 / 都会做同样的事情。

注意:这个工具设计为可扩展的。因此,虽然它包含生成广泛使用的原始代码(如命令)的包,但可以轻松添加生成 HTTP 控制器(+测试)、视图和其他任何内容的包。

注意:不考虑 Windows 支持。

简而言之

这是一个方便的工具,可以从模板生成空类文件和测试文件,并将它们放在可预测的位置。

  • 设置配置
  • 使用给定的配置运行命令

它可以生成什么

  • 您想要生成的内容
  • CommandBus:命令和处理类
  • QueryBus:请求、响应和处理
  • VO 和实体
  • 事件
  • 其他任何内容

每个类都附有空测试,这样我就可以继续进行 TDD。

安装

通过 composer

composer require lezhnev74/ddd-generator

用法

#Comman API
bin/dddtool generate <layer_name> <primitive_type> <primitive_namespace>

命令参数

  • <layer_name> - 3 种类型可供选择:"app"、"domain" 或 "infrastructure"
  • <primitive_type> - "command" 或在配置文件中设置的任何内容
  • <primitive_namespace> - psr-4 启发的文件路径,也用作命名空间。例如:"Account/Commands/SignUp"

更多用法示例

# Command generation
bin/dddtool generate domain command Account\Commands\SignUp
  
# Specify config
bin/dddtool generate app event Http\Event\HttpRequestRecieved -c path/to/config.php

# Run with no interaction (mind -y flag)
bin/dddtool generate app event Http\Event\HttpRequestRecieved -y
  

配置

您可以设置新文件将放置的文件夹。您可以配置每个原始代码 - 设置其别名并设置存根以生成新文件。

$config = [
    
    // 3 layers with independent folders for sources and for tests
    "layers" => [
        "app" => [
            "src" => [
                "qcn" => "\\App", // What base namespace to use
                "dir" => __DIR__."/src/app", // Where to put new source files
            ],
            "tests" => [
                "qcn" => "\\Tests", // what base namespace to use
                "dir" => __DIR__."/tests/app", // Where to put new tests files
            ],
        ],
        "domain" => [
            "src" => [
                "qcn" => "\\Domain",
                "dir" => "src/domain",
            ],
            "tests" => [
                "qcn" => "\\Tests",
                "dir" => __DIR__."/tests/domain",
            ],
        ],
        "infrastructure" => [
            "src" => [
                "qcn" => "\\Infrastructure",
                "dir" => __DIR__ . "/src/infrastructure",
            ],
            "tests" => [
                "qcn" => "\\Tests",
                "dir" => __DIR__ . "/tests/infrastructure",
            ],
        ],
    ],
        
    "primitives" => [
        "command" => [
            // these stubs will go to source folder
            "src" => [
                "stubs" => [
                    // See Templates paragraph on placeholders
                    "/*<PSR4_NAMESPACE_LAST>*/Command" => __DIR__ . "/stubs/SimpleStub.stub.php",
                    "/*<PSR4_NAMESPACE_LAST>*/Handler.php" => __DIR__ . "/stubs/SimpleStub.stub.php",
                ],
            ],
            // these files will go to tests folder
            "test" => [
                "stubs" => [
                    "/*<PSR4_NAMESPACE_LAST>*/CommandTest" => __DIR__ . "/stubs/SimpleTestStub.stub.php",
                ],
            ],
        
        ],
    ],
    
];

模板

每个原始代码可以拥有多个模板(存根)。例如,命令有命令和处理模板,查询有请求、响应和处理模板。事件将只有事件模板和测试。因此,配置明确声明要生成哪些文件以及放在哪个文件夹中。

模板支持少量占位符,反映了用户输入

  • /*<BASE_SRC_NAMESPACE>*/ - 看起来像 \App(每个层可能不同)
  • /*<BASE_TEST_NAMESPACE>*/ - 看起来像 \Domain\Tests(每个层可能不同)
  • /*<LAYER>*/ - app 或 domain 或 infrastructure
  • /*<PRIMITIVE>*/ - 原始代码的名称,例如 eventcommand
  • /*<PSR4_NAMESPACE>*/ - 看起来像 Account\Command\SignUp,参见 <primitive_namespace> 参数
  • /*<PSR4_NAMESPACE_BASE>*/ - 看起来像 Account\Command(不带最后一部分)
  • /*<PSR4_NAMESPACE_LAST>*/ 例如 SignedUp(仅最后一部分)
  • /*<FILENAME>*/ 例如 SignedUpCommand(此存根的最终文件名)

下面是如何在测试文件存根内部看起来

<?php
declare(strict_types = 1);

// Full class' namespace is combined from layer's base namespace + user provided namespace (see <primitive_namespace> argument) 
namespace /*<BASE_TEST_NAMESPACE>*/\/*<PSR4_NAMESPACE>*/;

use PHPUnit\Framework\TestCase;

// this is 
class /*<PSR4_NAMESPACE_LAST>*/ extends TestCase {
    
    function test_it_works() {
        $this->markTestIncomplete();
    }
    
}

工作原理

以上面显示的配置文件为例,我们来解释这个命令:bin/dddtool generate domain command Account\Commands\SignUp

脚本将执行以下操作

  • 首先,命令会检测您想要生成新文件的层。在我们的例子中是 "domain" 层
  • 然后检测该层的配置
  • 然后命令分析原始名称,在我们的例子中是 "command"
  • 然后检测该原始的配置
  • 然后对于配置中的每个占位符,都会准备一个新的文件。例如,名称为 /*<PSR4_NAMESPACE_LAST>*/CommandTest 的测试占位符实际上将在文件 __DIR__ . "/tmp/tests/Account/Commands/SignUp/SignUpCommandTest.php" 中创建。
  • 用户可以看到应该生成的文件列表
  • 确认后,真正的文件将被生成并放入文件系统中。

待办事项

  • 我正在考虑在占位符配置中添加条件,这样用户就可以被询问是否要跳过给定原始的某些可选占位符。
  • 我想知道我是否可以以任何方式简化这个工具的设计?