*/ protected const CASTS = []; /** * @var array */ public static array $errors = []; /** * @param mixed[] $data */ public function __construct( private readonly array $data ) { $this->load(); } public function __get(string $name): mixed { if (property_exists($this, $name)) { return $this->{$name}; } throw new Exception('Undefined object property ' . static::class . '::' . $name); } public function __isset(string $property): bool { return property_exists($this, $property); } public function load(): void { /** @var Validation $validation */ $validation = service('validation'); $validation->setRules($this::VALIDATION_RULES); if (! $validation->run($this->data)) { static::$errors = [...static::$errors, ...$validation->getErrors()]; } foreach ($validation->getValidated() as $key => $value) { if (array_key_exists($key, $this::CASTS)) { $cast = $this::CASTS[$key]; if (is_array($cast)) { if (is_array($value)) { foreach ($value as $valueKey => $valueElement) { $value[$valueKey] = new $cast[0]($valueElement); } } } else { $value = new $cast($value); } } $this->{$key} = $value; } } /** * @return array */ public function getErrors(): array { return $this->errors; } }