. */ namespace App\Serializer; use App\Entity\Base\AbstractStructuralDBElement; use App\Serializer\APIPlatform\SkippableItemNormalizer; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; /** * @see \App\Tests\Serializer\StructuralElementNormalizerTest */ class StructuralElementNormalizer implements NormalizerInterface, NormalizerAwareInterface { use NormalizerAwareTrait; public const ALREADY_CALLED = 'STRUCTURAL_ELEMENT_NORMALIZER_ALREADY_CALLED'; public function supportsNormalization($data, ?string $format = null, array $context = []): bool { //Only normalize if we are doing a file export operation if (!($context['partdb_export'] ?? false)) { return false; } if (isset($context[self::ALREADY_CALLED]) && in_array($data, $context[self::ALREADY_CALLED], true)) { //If we already handled this object, skip it return false; } return $data instanceof AbstractStructuralDBElement; } public function normalize($object, ?string $format = null, array $context = []): \ArrayObject|bool|float|int|string|array { if (!$object instanceof AbstractStructuralDBElement) { throw new \InvalidArgumentException('This normalizer only supports AbstractStructural objects!'); } //Avoid infinite recursion by checking if we already handled this object $context[self::ALREADY_CALLED] = $context[self::ALREADY_CALLED] ?? []; $context[SkippableItemNormalizer::DISABLE_ITEM_NORMALIZER] = true; $context[self::ALREADY_CALLED][] = $object; $data = $this->normalizer->normalize($object, $format, $context); //If the data is not an array, we can't do anything with it if (!is_array($data)) { return $data; } //Remove type field for CSV export if ($format === 'csv') { unset($data['type']); } $data['full_name'] = $object->getFullPath('->'); return $data; } /** * @return bool[] */ public function getSupportedTypes(?string $format): array { return [ //We cannot cache the result, as it depends on the context AbstractStructuralDBElement::class => false, ]; } }