lezhnev74 / ddd-generator
适用于三层应用的 DDD 生成器
0.2.0
2019-08-08 04:49 UTC
Requires
- php: ^7.1
- beberlei/assert: ^2.7||^3.0
- symfony/console: ^3.1
Requires (Dev)
- phpunit/phpunit: ^6.0
README
三层应用 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>*/
- 原始代码的名称,例如event
或command
/*<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"
中创建。 - 用户可以看到应该生成的文件列表
- 确认后,真正的文件将被生成并放入文件系统中。
待办事项
- 我正在考虑在占位符配置中添加条件,这样用户就可以被询问是否要跳过给定原始的某些可选占位符。
- 我想知道我是否可以以任何方式简化这个工具的设计?