. */ 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(); if (in_array($class, $instance->getTargetClass()) && $this->{$instance->getSourceProperty()} !== null) { return unserialize($this->{$instance->getSourceProperty()}, ['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(); if (in_array($object::class, $instance->getTargetClass())) { return $this->mutate([$instance->getSourceProperty() => serialize($object)]); } } return $this; } }