Salt la conținut
Struct — Date structurate

Struct — Date structurate

Leto\Data\Struct este o clasă abstractă pentru containere de date tipizate. Oferă serializare automată în array și JSON, reflection și auto-documentare. Este clasa de bază pentru Model (ORM).

Definirea unui Struct

Un Struct este o clasă cu proprietăți publice tipate:

use Leto\Data\Struct;

class ColumnDefinition extends Struct
{
    public string $name;
    public string $type;
    public bool $isPrimaryKey;
    public bool $isAutoIncrement;
    public bool $isNullable;
    public bool $hasDefault;
    public ?string $default;
}

Nu ai nevoie de getteri, setteri sau array-uri de configurare — doar proprietăți PHP tipate. Tipurile sunt deduse automat.

Creare și populare

// Instanțiere directă
$col = new ColumnDefinition();
$col->name = 'id';
$col->type = 'BIGINT(20)';
$col->isPrimaryKey = true;
$col->isAutoIncrement = true;
$col->isNullable = false;
$col->hasDefault = false;
$col->default = null;

Serializare

Array

$col = new ColumnDefinition();
$col->name = 'email';
$col->type = 'VARCHAR(255)';

// Convertire în array
$data = $col->toArray();
// ['name' => 'email', 'type' => 'VARCHAR(255)', ...]

// Creare din array
$col2 = ColumnDefinition::fromArray($data);

// Actualizare din array
$col->updateFromArray(['isNullable' => true]);

JSON

// Convertire în JSON
$json = $col->toJson();
// '{"name":"email","type":"VARCHAR(255)",...}'

// JSON formatat
$json = $col->toJson(pretty: true);

// Creare din JSON
$col2 = ColumnDefinition::fromJson($json);

// Actualizare din JSON
$col->updateFromJson($json);

Array-uri tipizate cu #[ArrayOf]

Când un câmp este un array de Struct-uri, folosește #[ArrayOf] pentru a specifica tipul elementelor:

use Leto\Data\Attributes\ArrayOf;

class TableDefinition extends Struct
{
    public string $name;

    #[ArrayOf(ColumnDefinition::class)]
    public array $columns;
}

Serializarea și deserializarea merg recursiv — array-ul de ColumnDefinition este automat convertit.

describe() — Reflection automat

Fiecare Struct expune metoda statică describe() care returnează metadate despre toate proprietățile:

$desc = ColumnDefinition::describe();

// $desc->name → 'Database\Integrity\ColumnDefinition'
// $desc->className → 'Database\Integrity\ColumnDefinition'
// $desc->attributes → [
//     'name' => StructAttributeDescription { name: 'name', type: 'string', ... },
//     'type' => StructAttributeDescription { name: 'type', type: 'string', ... },
//     ...
// ]

Pentru fiecare atribut, StructAttributeDescription oferă:

CâmpDescriere
nameNumele proprietății
typeTipul PHP (string, int, bool, DateTimeImmutable, etc.)
nullableDacă acceptă null
hasDefaultDacă are valoare implicită
defaultValoarea implicită
arrayTypeTipul elementelor (dacă e array cu #[ArrayOf])
virtualDacă e un câmp virtual (nu stocat)

Cazuri reale de utilizare

Struct este folosit în proiectele Workleto ca bază pentru:

  • Definiții de tabele și coloaneColumnDefinition și TableDefinition moștenesc Struct pentru a reprezenta schema bazei de date
  • Job-uri — clasa abstractă Job extinde Struct, iar clasele concrete adaugă proprietățile specifice fiecărui job; Struct oferă serialize/deserialize pentru starea job-ului
  • Model (ORM)Model extinde Struct, adăugând capabilități de interogare, relații și persistență. Toate metodele toArray(), fromArray(), toJson(), fromJson() sunt moștenite din Struct.

De ce Struct și nu array-uri simple?

Array simpluStruct
$data['name'] — fără autocompletare$obj->name — completare IDE
Fără verificare de tipTipuri PHP native (string, int, bool)
Nedocumentat, greu de înțelesdescribe() oferă schema completă
Serializare manualătoArray() / toJson() automat
Fără #[ArrayOf] recursivArrays tipizate, serializare recursivă