. */ namespace SP\Domain\Common\Models; use ReflectionClass; use SP\Domain\Common\Attributes\Hydratable; /** * Trait SerializedModel */ trait SerializedModel { /** * @template THydrate * @param class-string $class * * @return THydrate|null */ 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 unserialize($property, ['allowed_classes' => [$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() => serialize($object)]); } } return $this; } }