dataclass können Sie Ihr einfaches array
schnell in eine PHP-Klasse mit Typhinweis ändern und eingebettete Objekte und Sammlungen automatisch denormalisieren, was normalerweise viel Arbeit erfordert, wenn Sie Normalisierer und Denormalisierer verwenden. Die Bibliothek ist vom Python-Pydantic-Modul inspiriert. Es nutzt die seit PHP 7.4 verfügbare Typhinweisfunktion.
Das Hauptziel dieses Pakets besteht darin, eine schnelle Möglichkeit zu bieten, streng typisierte Klassen für die weitere Verwendung bereitzustellen, beispielsweise um die Anforderungsnutzlast einer streng typisierten Klasse zuzuordnen, sodass Sie sie anstelle eines Arrays verwenden können, das möglicherweise Ihren Anforderungen entspricht oder nicht. Es ersetzt nicht Ihre Datenvalidierung, stellt aber sicher, dass fx die empfangene JSON-Nutzlast mit den Typen übereinstimmt, die Ihre Back-End-Vorgänge erwarten. Es ist so etwas wie die oben erwähnte pydantische BaseModel
oder TypeScript-Schnittstelle.
Sie müssen lediglich eine oder zwei Klassen erstellen:
declare (strict_types= 1 );
class MyEmbededClass
{
public float $ number ;
}
class MyClass
{
public int $ number ;
public ? string $ optionalText = null ;
public MyEmbededClass $ embeded ;
}
Übergeben Sie im nächsten Schritt den Namen der Hauptklasse und die empfangenen Daten, beispielsweise vom empfangenen JSON, an die transform
:
$ data = ' {
"number": 1,
"embeded": {
"number": 1.23
}
} ' ;
$ object = transform (MyClass::class, json_decode ( $ data , true ));
So ordnen Sie empfangene Daten schnell einer voll funktionsfähigen dataclass zu:
var_dump ( $ object )
object (MyClass) {
[ " number " ]=> int( 1 )
[ " optionalText " ]=> NULL
[ " embeded " ]=>
object(MyEmbededClass) {
[ " number " ]=>
float( 1.23 )
}
}
Sie müssen sich keine Gedanken über die Übergabe von null
von json_decode
machen, es wird TransformException
für root
auslösen, wenn es erkannt wird.
Sie müssen sich keine Sorgen über fehlende Felder und ungültige Typen machen, da die Bibliothek alle typbezogenen Anforderungen erkennt und TransformException
mit Fehlern auslöst (bereit zur Bereitstellung als Antwort), die auf genaue Felder mit einer einfachen Begründungsmeldung verweist, zum Beispiel:
echo json_encode ( $ transformException , JSON_PRETTY_PRINT )
{
"errors" : [
{
"field" : " optionalText " ,
"reason" : " Field must have value "
},
{
"field" : " embeded " ,
"reason" : " Field must have value "
}
]
}
Sie können auch die Methode Transform::to
verwenden, die tatsächlich von transform
Hilfsfunktion aufgerufen wird. Die Hilfsfunktion verwendet immer die optimalen Einstellungen für Transform
(sobald sie angezeigt werden).
$ data = ' {
"number": 1,
"embeded": {
"number": 1.23
}
} ' ;
$ transformer = new Transform ();
$ object = $ transformer -> to (MyClass::class, json_decode ( $ data , true ));
Wenn Sie einen Konstruktor mit typbezogenen Argumenten verwenden müssen, können Sie dies tun, jedoch in eingeschränkter Weise. Die Bibliothek unterstützt nur das Ausfüllen von Konstruktorargumenten mit Werten aus der Nutzlast. Das bedeutet, dass der Konstruktor dieselben Typen und Variablennamen wie die Klasseneigenschaften verwenden muss. Zum Beispiel:
class MyClass
{
public float $ number ;
public ? int $ numberTwo = null ;
public function __construct ( float $ number )
{
$ this -> number = $ number ;
}
}
Die Verwendung eines anderen Namens oder Typs für das Konstruktorargument funktioniert nicht. Ziel ist es, den Bauträger dabei zu unterstützen, die Eigenschaften auszufüllen.
Jeder Konstruktor, der einen anderen Parameter als die Eigenschaften enthält, löst UnsupportedException
aus. Parameter müssen denselben Typ wie Eigenschaften haben. Reihenfolge ist irrelevant. Bei Bedarf kann im Konstruktor nur eine Teilmenge der Eigenschaften vorhanden sein.
Weitere Beispiele finden Sie im Verzeichnis docs/.
So einfach wie
composer install rutek/ dataclass
Achtung: Bitte beachten Sie die Verwendung von array
Typ-Hinweisen. Sie können nicht verwendet werden (wird bei Erkennung UnsupportedException
auslösen), da PHP keine Möglichkeit bietet, Array-Elemente mit Typhinweisen zu versehen. Weitere Informationen finden Sie im Abschnitt „Sammlungen“ weiter unten.
Alle vier PHP-Skalare werden unterstützt.
Typhinweis-Nullfähigkeit wird unterstützt. Sie können beispielsweise sicher ?string
verwenden, um sowohl string
als auch null
zu akzeptieren. Bitte beachten Sie, dass die Verwendung von nur ?string $field
nicht bedeutet, dass das transformierte Array dieses Feld möglicherweise nicht enthält. Es bedeutet nur, dass dieser Wert null
akzeptiert.
Wenn Sie die Transformation von Daten akzeptieren müssen, die einige Felder nicht enthalten, können Sie Standardwerte verwenden, zum Beispiel: ?string $field = null
. Die dataclass erkennt, dass diese Eigenschaft nicht in der Nutzlast vorhanden ist, und verwendet stattdessen den Standardwert.
PHP unterstützt keine array
-Felder mit Typhinweisen. Wenn Sie eine Sammlung von Objekten oder Skalaren einbetten müssen, müssen Sie Collection
Klasse verwenden. Sie müssen es mit einem Konstruktor mit typbezogener Argumentdekonstruktion erweitern, zum Beispiel:
class Tags extends Collection
{
public function __construct ( string ... $ names )
{
$ this -> items = $ names ;
}
}
Typhinweis-Arrays wie string[]
wurden in RFC abgelehnt, daher wird sich dieses Verhalten wahrscheinlich nicht so schnell ändern.
Die Bibliothek prüft, ob die bereitgestellten Werte mit der Typangabe des Konstruktors übereinstimmen.
Es gibt keine Möglichkeit, Mindest- und Höchstwerte zu überprüfen, aber möglicherweise wird eine solche Funktion in nächsten Versionen verfügbar sein.
Bitte beachten Sie, dass Sie auch Collection als Basisklasse verwenden können, die Sie transformieren möchten, zum Beispiel:
$ tags = transform (Tags::class, [ ' tag1 ' , ' tag2 ' ]);
TransformException
– Daten stimmen nicht mit Ihrem Schema überein Dies ist die Grundausnahme, die Sie erwarten können. Jedes Mal, wenn Ihre Daten (Nutzlast), die an die Funktion transform(string $class, $data)
oder Transform::to
übergeben werden, nicht mit Ihren typbezogenen Klassen übereinstimmen, erhalten Sie TransformException
mit der Methode getErrors(): FieldError[]
die beschreibt, was wirklich passiert.
Jeder FieldError
enthält sowohl field
das beschreibt, welches Feld die Typprüfung nicht bestanden hat, als auch reason
der in einfachen Worten beschreibt, warum es abgelehnt wurde. Wenn verschachtelte Objekte vorhanden sind, können Sie davon ausgehen, dass Sie field
wie parentProperty.childrenProperty
(durch Punkte getrennte Ebenen) erhalten.
Die Klasse unterstützt die JSON-Serialisierung und gibt immer etwas zurück wie:
{
"errors" : [
{
"field" : " optionalText " ,
"reason" : " Field must have value "
},
{
"field" : " embeded " ,
"reason" : " Field must have value "
}
]
}
Bitte beachten Sie, dass das code
möglicherweise in Zukunft hinzugefügt wird.
UnsupportedException
– nur, wenn Ihre Typhinweise nicht unterstützt werden Die Bibliothek deckt nicht alle Szenarios ab, da Sie Typhinweise definieren können, die keinen strengen Kontext hätten. Wenn Sie beispielsweise object
verwenden, ist eine Validierung nicht möglich, da jedes Objekt mit Ihrem Schema übereinstimmt. In solchen Fällen können Sie mit UnsupportedException
rechnen.
PHP 8.0-Union-Typen und PHP 8.1-Schnittpunkttypen werden derzeit nicht unterstützt.
Native PHP 8.1-Enums werden derzeit nicht unterstützt.
Alle Felder mit Typhinweisen müssen vorerst öffentlich sein. Die Implementierung einer solchen Funktion ist fraglich, da Sie Getter für solche Eigenschaften erstellen müssten, was einen unerwünschten Mehraufwand darstellt. Die Bibliothek soll die Möglichkeit schaffen, interne Schemata für Daten zu definieren, die von Remote-Systemen (APIs, Warteschlangen/Busnachrichten, Browser) empfangen werden.
Alle Reflexionsprüfungen werden jedes Mal durchgeführt, wenn die Funktion transform
oder Transform::to
aufgerufen wird. Sie können bald Caching-Funktionalität für eine bessere Leistung erwarten.
Bitte beachten Sie, dass das Ziel dieses Pakets nicht darin besteht, die von Ihnen empfangenen Daten vollständig zu validieren, sondern einfache Klassen zu erstellen, die Ihre Nutzdaten auch dann vollständig typgestützt machen, wenn sie eine komplizierte Struktur haben. Sie müssen Ihre Klassen nicht in JSON mit class
codieren, da Ihre Typhinweise Ihrem Code mitteilen, welches Objekt oder Array anstelle einiger eingebetteter Werte erstellt werden soll.
Wenn Sie eine API erstellen und eine OpenAPI-Schemavalidierung auf Unternehmensniveau benötigen, sollten Sie hkarlstrom/openapi-validation-middleware überprüfen. Anschließend können Sie die empfangene Nutzlast mithilfe dieser Bibliothek typgekennzeichneten Klassen zuordnen! :) :)