. */ namespace SP\Domain\Common\Models; use ReflectionClass; use SP\Domain\Common\Adapters\Serde; use SP\Domain\Common\Attributes\Hydratable; use SP\Domain\Core\Exceptions\SPException; /** * Trait SerializedModel */ trait SerializedModel { /** * @template THydrate * @param class-string $class * * @return THydrate|null * @throws SPException */ public function hydrate(string $class): ?object { $reflectionClass = new ReflectionClass($this); foreach ($reflectionClass->getAttributes(Hydratable::class) as $attribute) { /** @var Hydratable $instance */ $instance = $attribute->newInstance(); $valid = array_filter( $instance->getTargetClass(), static fn(string $targetClass) => is_a($class, $targetClass, true) ); $property = $this->{$instance->getSourceProperty()}; if (count($valid) > 0 && $property !== null) { return Serde::deserialize($property, $class) ?: null; } } return null; } /** * @inheritDoc */ public function dehydrate(object $object): static { $reflectionClass = new ReflectionClass($this); foreach ($reflectionClass->getAttributes(Hydratable::class) as $attribute) { /** @var Hydratable $instance */ $instance = $attribute->newInstance(); $valid = array_filter( $instance->getTargetClass(), static fn(string $targetClass) => is_a($object, $targetClass, true) ); if (count($valid) > 0) { return $this->mutate([$instance->getSourceProperty() => Serde::serialize($object)]); } } return $this; } }