此軟件包允許您通過在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。
麻省理工學院許可證(麻省理工學院)。請參閱許可證文件以獲取更多信息。