JSON → PHP 8.2+ DTO
Moderne PHP-Architektur

JSON zu PHP 8.2+ Typed Readonly DTO Generator

Konvertieren Sie JSON-Daten in moderne PHP 8.2+ readonly class DTOs mit Constructor Promotion und fromArray-Deserialisierern.

Vorlagen
JSON-Eingabe-PayloadGültig
<?php

declare(strict_types=1);

namespace App\DTO;

/**
 * @param string[] $tags
 */
final readonly class UserDto implements \JsonSerializable
{
    public function __construct(
        public string $id,
        public string $email,
        public string $username,
        public string $displayName,
        public string $role,
        public bool $isActive,
        public TenantDto $tenant,
        public PreferencesDto $preferences,
        /** @var string[] */
        public array $tags = [],
        public \DateTimeImmutable $lastLoginAt,
        public \DateTimeImmutable $createdAt,
    ) {}

    public static function fromArray(array $data): self
    {
        return new self(
            id: (string) ($data['id'] ?? $data['id'] ?? null ?? ''),
            email: (string) ($data['email'] ?? $data['email'] ?? null ?? ''),
            username: (string) ($data['username'] ?? $data['username'] ?? null ?? ''),
            displayName: (string) ($data['display_name'] ?? $data['displayName'] ?? null ?? ''),
            role: (string) ($data['role'] ?? $data['role'] ?? null ?? ''),
            isActive: (bool) ($data['is_active'] ?? $data['isActive'] ?? null ?? false),
            tenant: TenantDto::fromArray((array) ($data['tenant'] ?? [])),
            preferences: PreferencesDto::fromArray((array) ($data['preferences'] ?? [])),
            tags: array_map(fn($item) => (string) $item, (array) ($data['tags'] ?? [])),
            lastLoginAt: isset($data['last_login_at']) ? new \DateTimeImmutable((string) $data['last_login_at']) : null,
            createdAt: isset($data['created_at']) ? new \DateTimeImmutable((string) $data['created_at']) : null,
        );
    }

    public function toArray(): array
    {
        return [
            'id' => $this->id,
            'email' => $this->email,
            'username' => $this->username,
            'display_name' => $this->displayName,
            'role' => $this->role,
            'is_active' => $this->isActive,
            'tenant' => $this->tenant->toArray(),
            'preferences' => $this->preferences->toArray(),
            'tags' => $this->tags,
            'last_login_at' => $this->lastLoginAt?->format(\DateTimeInterface::ATOM),
            'created_at' => $this->createdAt?->format(\DateTimeInterface::ATOM),
        ];
    }

    public function jsonSerialize(): array
    {
        return $this->toArray();
    }
}

final readonly class TenantDto implements \JsonSerializable
{
    public function __construct(
        public string $id,
        public string $name,
        public string $tier,
        public int $activeSeats,
        public string $billingContact,
    ) {}

    public static function fromArray(array $data): self
    {
        return new self(
            id: (string) ($data['id'] ?? $data['id'] ?? null ?? ''),
            name: (string) ($data['name'] ?? $data['name'] ?? null ?? ''),
            tier: (string) ($data['tier'] ?? $data['tier'] ?? null ?? ''),
            activeSeats: (int) ($data['active_seats'] ?? $data['activeSeats'] ?? null ?? 0),
            billingContact: (string) ($data['billing_contact'] ?? $data['billingContact'] ?? null ?? ''),
        );
    }

    public function toArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'tier' => $this->tier,
            'active_seats' => $this->activeSeats,
            'billing_contact' => $this->billingContact,
        ];
    }

    public function jsonSerialize(): array
    {
        return $this->toArray();
    }
}

final readonly class PreferencesDto implements \JsonSerializable
{
    public function __construct(
        public string $theme,
        public bool $notificationsEnabled,
        public string $locale,
        public string $timezone,
    ) {}

    public static function fromArray(array $data): self
    {
        return new self(
            theme: (string) ($data['theme'] ?? $data['theme'] ?? null ?? ''),
            notificationsEnabled: (bool) ($data['notifications_enabled'] ?? $data['notificationsEnabled'] ?? null ?? false),
            locale: (string) ($data['locale'] ?? $data['locale'] ?? null ?? ''),
            timezone: (string) ($data['timezone'] ?? $data['timezone'] ?? null ?? ''),
        );
    }

    public function toArray(): array
    {
        return [
            'theme' => $this->theme,
            'notifications_enabled' => $this->notificationsEnabled,
            'locale' => $this->locale,
            'timezone' => $this->timezone,
        ];
    }

    public function jsonSerialize(): array
    {
        return $this->toArray();
    }
}
3 Classes
Generierte DTO-Klassen
20 Felder
Typisierte Eigenschaften
0ms Serververzögerung
PHP 8.2+ Readonly Engine

PHP 8.2+ Readonly-Klassen & Constructor Promotion

Nutzt moderne PHP 8.2 Readonly-Klassen mit Constructor Promotion, strikter Typisierung und tiefer Unveränderlichkeit für maximale Typsicherheit.

100% Client-Side Datenschutz

Sämtliches JSON-Parsing, Typerkennung und PHP-Code-Generierung erfolgen vollständig in Ihrem Browser-Speicher ohne Serverübertragung.

Bidirektionale Serialisierung & Deserialisierung

Erzeugt typsichere statische fromArray() Factory-Methoden mit rekursiver DTO-Hydratisierung sowie toArray() und JsonSerializable.

Technische Referenz & Architektur-Leitfaden

JSON zu PHP 8.2+ Typed Readonly DTO Generator Entwickler-Handbuch — Referenz-Leitfaden

Konvertieren Sie JSON-Daten in moderne PHP 8.2+ readonly class DTOs mit Constructor Promotion und fromArray-Deserialisierern.

Wichtige Parameter & Steuerelemente

Root Class NameString (PHP-Bezeichner)

Klassenbezeichner der obersten Ebene für das Root-JSON-Objekt.

Standard: RootDto
NamespaceString (PHP-Namespace)

PSR-4-konformer PHP-Namespace für die generierten DTO-Klassendateien.

Standard: App\DTO
PHP Target VersionEnum ('8.2+', '8.1', '8.0')

Zielsyntax der PHP-Version; 8.2+ deklariert readonly classes mit Constructor Property Promotion.

Standard: 8.2+
Constructor PromotionBoolean

Deklariert und initialisiert typisierte Eigenschaften direkt in der Parameterliste von __construct().

Standard: true
Deserializer Hydration (fromArray)Boolean

Erzeugt eine typsichere statische fromArray(array $data): self Factory-Methode mit rekursiver DTO-Hydratisierung.

Standard: true
Property CasingEnum ('camelCase', 'snake_case', 'preserve')

Konvertiert JSON-Schlüssel in idiomatische PHP-camelCase-Eigenschaften unter Beibehaltung der Quell-Mappings.

Standard: camelCase
DateTime DetectionBoolean

Erkennt ISO-8601-Datumsangaben automatisch und typisiert sie als \DateTimeImmutable-Eigenschaften.

Standard: true

Profi-Tipps & Best Practices

Rekursive DTO-Hydratisierung

Verwenden Sie in fromArray() bei verschachtelten Objekten oder Arrays array_map(), um untergeordnete DTO-Hydratoren rekursiv und null-sicher aufzurufen.

Durch die Deklaration von readonly

Durch die Deklaration von readonly class in PHP 8.2 werden alle Instanzeigenschaften automatisch readonly, was versehentliche Mutationen verhindert und echte Value-Object-Semantik garantiert.

Heterogene Arrays & Union Types

Nutzen Sie für unvollständige oder gemischte Datensätze PHP 8.0+ Union Types (z. B. string|int|null) und PHPDoc-Typisierungen (/** @var list<UserDto> */) für lückenlose PHPStan- und Psalm-Prüfungen auf Level 8+.

Framework-Attribut-Entkopplung

Kombinieren Sie Constructor Promotion mit Symfony #[SerializedName('key')] oder Spatie #[MapInputName], um externe API-Formate sauber von internen Domain-DTOs zu trennen.

Häufige Fallstricke & Fehlerbehebung

Laufzeitfehler 'Cannot modify readonly property'

Readonly-Eigenschaften in PHP 8.2 dürfen nach der Konstruktor-Ausführung nicht mehr modifiziert werden. Nutzen Sie unveränderliche With-Methoden (Klonen mit Änderung) oder übergeben Sie alle Werte bei der fromArray()-Instanziierung.

Fehler beim Entpacken verschachtelter assoziativer Arrays

Übergeben Sie verschachtelte Roh-Arrays niemals direkt an typisierte Klassenparameter, sondern mappen Sie diese stets über die statische fromArray()-Methode des Kind-DTOs.

DateMalformedStringException bei Datums-Parsing ab PHP 8.3

Validieren Sie den Datums-String vor der Instanziierung von \DateTimeImmutable oder fangen Sie Ausnahmen in einem try-catch-Block ab, um sicher auf nullable ?\DateTimeImmutable zurückzugreifen.

Häufig gestellte Fragen (FAQ)

Welche Vorteile bieten PHP 8.2 Readonly-Klassen für DTOs?▼

Sie verhindern jede Modifikation nach der Erstellung und verbieten dynamische Attribute vollständig. Das gewährleistet echte Immutability, Thread-Sicherheit in asynchronen Runtimes (Swoole, RoadRunner) und erfordert keine defensiven Kopien.

Wie reduziert Constructor Property Promotion den Boilerplate-Code?▼

Statt Eigenschaften separat zu deklarieren, im Konstruktor aufzuführen und manuell per $this->prop = $prop zuzuweisen, vereint Constructor Promotion Sichtbarkeit, Typ und Standardwert direkt in der __construct()-Signatur und spart über 60 % Code ein.

Können DTOs für Symfony Serializer oder Spatie Laravel Data generiert werden?▼

Ja, über Attribut-Optionen können Framework-Annotationen wie Symfony #[SerializedName] oder Spatie #[MapInputName] eingebunden werden, was die Abbildung zwischen snake_case JSON und camelCase PHP nahtlos ermöglicht.

Wie geht fromArray() mit fehlenden oder nullbaren Feldern um?▼

Der Generator erkennt fehlende oder optionale Werte in den JSON-Beispielen, versieht Eigenschaften mit Nullable-Typen (?string $name = null) und verwendet Null-Coalescing ($data['name'] ?? null), um Undefined-Key-Warnungen zu vermeiden.

Werden JSON-Daten während der Generierung an externe Server gesendet?▼

Nein. Sämtliche JSON-Analysen, Typableitungen und PHP-Generierungen laufen vollständig lokal in Ihrer Browser-Sandbox über clientseitiges JavaScript ab. Keine Daten verlassen Ihr System.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →