Mit diesem Paket können Sie durch kurz deklariertes Schema in PHP-Code saubere und unabhängige DTO-Klassen (auch als "Wertobjekte" bezeichnet) generieren.
Sie benötigen dieses Paket nur in der Entwicklungsumgebung, da generierte Klassen nichts aus dem Code dieser Bibliothek verwenden. Aus diesem Grund besteht der bevorzugte Weg darin, es als require-dev einzubeziehen:
$ composer require --dev klkvsk/dto-generator
Schema ist eine regelmäßige PHP-Datei überall in Ihrem Projekt. Die Datei sollte ein Schema -Objekt von oberster Ebene zurückgeben.
Beispielschema:
<?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 ),
]
),
]
); Die Codegenerierung erfolgt mit dem Befehl dto-gen :
$ ./vendor/bin/dto-gen [schema-file]
Standardmäßig sucht Generator nach Dateien, die mit dto.schema.php benannt sind oder enden, aber Sie können Schema -Dateien manuell als Argumente angeben.
Generator versucht, den richtigen Pfad für die Ausgabe zu erraten, indem sie sich Autoloadpfade in Composer.json ansehen. Wenn es PSR-4-Mapping für "MyProject\": "src/" angibt, wird die obige Datei in src/Data/Person.php platziert.
Um dieses Verhalten zu überschreiben, können Sie outputDir direkt angeben:
dto schema (namespace: " MyProject \ Data " , outputDir: " src/generated/ " , ...);Verwenden Sie, um Code zu generieren, die auf eine minimale Version von PHP abzielen:
./vendor/bin/dto-gen --target 7.4
Diese Option ermöglicht oder deaktiviert einige neuere Sprachfunktionen im resultierenden Code.
Es ist möglich, nicht nur DTOs, sondern auch verwandte Aufzüge zu generieren:
dto schema(
objects: [
dto enum (
name: ' PostStatus '
cases: [ ' draft ' , ' published ' , ' deleted ' ]
),
dto object(
name: ' Post ' ,
fields: [
dto field ( ' status ' , t enum ( ' PostStatus ' ), required: true ),
. . .
]
)
]
)Für php> = 8.0 native Enum wird für ältere Versionen eine sehr ähnliche klassenbasierte Implementierung verwendet.
DTOs dienen dazu, Ihre Daten stark tippt zu halten. Typen für Schema sind:
tint , tbool , tstring , tfloat - grundlegende Skalartypentenum , tobject - zum Verweisen auf andere DTO -Objektetdate - Verwenden von DateTimeMimmabletexternal - zum Verweisen auf andere Nicht -DTO -Klassentlist_(T) - Wickel um Typ t, um t [] zu deklarieren []tmixed - wenn du es wirklich nicht weißt (wobei t ein Alias zu KlkvskDtoGeneratorSchemaTypes ist)
Außerdem können Sie die abstrakte Type für Ihre Bedürfnisse erweitern.
DTOs können mit einem regulären Konstruktor oder mit <DTO>::create(array $data) erstellt werden.
Methode create akzeptiert ein assoziatives Array mit Daten. Diese Daten werden dann gefiltert (falls sie vorab gereinigt werden müssen) und importiert (in geeignete Typen konvertiert). Danach ruft die Methode einen Standardkonstruktor auf, der importierte Felder an sie weitergibt. Der Konstruktor erhalten Felder nicht nur nach Typ, sondern auch nach einer benutzerdefinierten Logik.
Es gibt also drei Datenmanipulationen, die jeweils in Schema mit Anrufleuten beschrieben werden können:
filter erstellt die zu importierenden Datenimporter leitet den Wert auf, um Typ zu korrigieren oder ein verschachteltes Objekt zu instanziierenvalidator prüft, dass der importierte Wert angegebene Kriterien erfüllt filter und importer sollten den verarbeiteten Wert zurückgeben. Wenn ein null zurückgegeben wird, werden weitere Schließungen nicht aufgerufen.
validator gibt true/false zurück und bei falsch wird automatisch ein InvalidArgumentException geworfen. Außerdem können Sie Ihre eigene Ausnahme auswerfen und nichts zurückgeben.
Verschlüsse des filter und validator sind in Schema definiert:
dtofield('age', tint(),
filters: [ fn ($x) => preg_replace('/[^0-9]+/', $x) ],
validators: [ fn ($x) => $x > 0 && $x < 100 ]
)
Der Verschluss des Typ importer ist für alle Typen mit Ausnahme von tobject :
dtofield('file', texternal(SplFileInfo::class, fn ($x) => new SplFileInfo($x))
Sie können einen benutzerdefinierten Importeur angeben, wenn Sie Type für Ihre eigenen Anforderungen erweitern.
Siehe / Beispiel / Dir für das Beispielschema und generierte Klassen für verschiedene PHP -Versionen.
Die MIT -Lizenz (MIT). Weitere Informationen finden Sie unter Lizenzdatei.