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âmp | Descriere |
|---|---|
name | Numele proprietății |
type | Tipul PHP (string, int, bool, DateTimeImmutable, etc.) |
nullable | Dacă acceptă null |
hasDefault | Dacă are valoare implicită |
default | Valoarea implicită |
arrayType | Tipul elementelor (dacă e array cu #[ArrayOf]) |
virtual | Dacă 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 coloane —
ColumnDefinitionșiTableDefinitionmoștenescStructpentru a reprezenta schema bazei de date - Job-uri — clasa abstractă
JobextindeStruct, iar clasele concrete adaugă proprietățile specifice fiecărui job;Structoferă serialize/deserialize pentru starea job-ului - Model (ORM) —
ModelextindeStruct, adăugând capabilități de interogare, relații și persistență. Toate metodeletoArray(),fromArray(),toJson(),fromJson()sunt moștenite dinStruct.
De ce Struct și nu array-uri simple?
| Array simplu | Struct |
|---|---|
$data['name'] — fără autocompletare | $obj->name — completare IDE |
| Fără verificare de tip | Tipuri PHP native (string, int, bool) |
| Nedocumentat, greu de înțeles | describe() oferă schema completă |
| Serializare manuală | toArray() / toJson() automat |
Fără #[ArrayOf] recursiv | Arrays tipizate, serializare recursivă |