此软件包允许您通过在PHP代码中简要声明架构来生成清洁和独立的DTO类(也称为“值对象”)。
您只需要在开发环境中使用此软件包,因为生成的类不使用此库代码中的任何内容。这就是为什么首选的方法是将其包含在require-dev中:
$ composer require --dev klkvsk/dto-generator
模式是您项目中任何地方的常规php文件。该文件应从顶层返回Schema对象。
示例模式:
<?php
use Klkvsk DtoGenerator Schema as dto ;
use Klkvsk DtoGenerator Schema Types as t ;
return dto schema (
namespace: ' MyProjectData ' ,
objects: [
new dto object (
name: ' Person ' ,
fields: [
dto field ( ' name ' , t string (), required: true ),
dto field ( ' age ' , t int (), required: true ),
]
),
]
);代码生成是通过dto-gen命令完成的:
$ ./vendor/bin/dto-gen [schema-file]
默认情况下,Generator搜索名称或以dto.schema.php结尾的文件,但是您可以手动提供架构文件作为参数。
发电机将尝试通过查看Composer.json中的自动加载路径来猜测正确的输出路径。如果它说明"MyProject\": "src/"的psr-4映射,则以上文件将放置在src/Data/Person.php中。
为了覆盖此行为,您可以直接指定outputDir :
dto schema (namespace: " MyProject \ Data " , outputDir: " src/generated/ " , ...);要生成针对某些最小版本的PHP的代码,请使用:
./vendor/bin/dto-gen --target 7.4
此选项可以在结果代码中启用或禁用一些较新的语言功能。
不仅可以生成DTO,还可以生成相关的枚举:
dto schema(
objects: [
dto enum (
name: ' PostStatus '
cases: [ ' draft ' , ' published ' , ' deleted ' ]
),
dto object(
name: ' Post ' ,
fields: [
dto field ( ' status ' , t enum ( ' PostStatus ' ), required: true ),
. . .
]
)
]
)对于PHP> = 8.0,将生成本机枚举,对于较旧的版本,使用了非常相似的基于类的实现。
DTO的目的是使您的数据强烈键入。模式类型是:
tint , tbool , tstring , tfloat基本标量类型tenum , tobject用于引用其他DTO对象tdate使用DateTimeImmutabletexternal - 引用任何其他非DTO类tlist_(T) - 围绕T型缠绕以声明t []tmixed - 如果您真的不知道(其中t是与KlkvskDtoGeneratorSchemaTypes别名)
另外,您可以为您的需求扩展抽象Type类。
DTO可以使用常规构造函数或<DTO>::create(array $data)方法创建。
方法create接受与数据的关联数组。然后对该数据进行过滤(如果需要事先清理)并导入(转换为适当的类型)。之后,该方法调用默认构造函数,将导入字段传递给其。构造函数获得不仅按类型验证的字段,而且通过自定义逻辑验证。
因此,数据操作的三个阶段,每个阶段都可以在带有可呼出的模式中描述:
filter准备要导入的数据importer铸造价值以纠正类型或实例化嵌套对象validator检查filter和importer关闭应返回处理的值。如果返回null ,则未调用进一步的封闭。
validator返回true/fals,并且在False上自动抛出InvalidArgumentException 。另外,您可以提出自己的例外,不要返回任何东西。
类型filter和validator的关闭在模式中定义:
dtofield('age', tint(),
filters: [ fn ($x) => preg_replace('/[^0-9]+/', $x) ],
validators: [ fn ($x) => $x > 0 && $x < 100 ]
)
类型importer的闭合均针对所有类型的预定义,除了tobject :
dtofield('file', texternal(SplFileInfo::class, fn ($x) => new SplFileInfo($x))
如果您为自己的需求扩展Type ,则可以指定自定义进口商。
有关示例模式和不同PHP版本的生成类,请参见 /示例 / DIR。
麻省理工学院许可证(麻省理工学院)。请参阅许可证文件以获取更多信息。