このパッケージを使用すると、PHPコードで簡単に宣言されたスキーマによって、クリーンで独立したDTOクラス(「値オブジェクト」とも呼ばれます)を生成できます。
生成されたクラスはこのライブラリのコードから何も使用しないため、開発環境でこのパッケージのみが必要です。そのため、好みの方法は、それをrequire-devとして含めることです。
$ composer require --dev klkvsk/dto-generator
Schemaは、プロジェクトのどこでも通常の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のAutoloADパスを調べることにより、出力の正しいパスを推測しようとします。 "MyProject\": "src/"上記のファイルは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の場合、ネイティブenumsが生成されます。古いバージョンの場合、非常に類似したクラスベースの実装が使用されます。
DTOは、データを強く入力することを目的としています。スキーマのタイプは次のとおりです。
tint 、 tbool 、 tstring 、 tfloat -Basic Scalarタイプtenum 、 tobject - 他のdtoオブジェクトを参照するためtdate dateTimeImmutableを使用しますtexternal他の非DTOクラスを参照するためtlist_(T) - タイプtを巻き付けてt []を宣言しますtmixedあなたが本当に知らないなら(ここで、 tはKlkvskDtoGeneratorSchemaTypesのエイリアスです)
また、ニーズに合わせて抽象Typeクラスを拡張できます。
DTOは、通常のコンストラクターまたは<DTO>::create(array $data)メソッドを使用して作成できます。
メソッドcreate 、データを使用した連想配列を受け入れます。そのデータは、(事前にクリーンアップが必要な場合)フィルタリングされ、インポート(適切なタイプに変換されます)。その後、メソッドはデフォルトのコンストラクターを呼び出し、インポートされたフィールドを渡します。コンストラクターは、タイプだけでなくカスタムロジックによって検証されたフィールドを取得します。
したがって、データ操作には3つの段階があり、それぞれがCALLABLEを使用してスキーマで説明できます。
filter 、インポートするデータを準備しますimporter価値をキャストして、ネストされたオブジェクトをタイプまたはインスタンス化しますvalidator 、インポートされた値が指定された基準を満たしていることをチェックしますfilterとimporter閉鎖は、処理された値を返す必要があります。 nullが返された場合、さらなる閉鎖は呼び出されません。
validator true/falseを返し、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を拡張する場合は、カスタムインポーターを指定できます。
スキーマの例については /例 / dirを参照し、さまざまなPHPバージョンのクラスを生成します。
MITライセンス(MIT)。詳細については、ライセンスファイルをご覧ください。