vendor/symfony/serializer/Normalizer/BackedEnumNormalizer.php line 28

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Serializer\Normalizer;
  11. use Symfony\Component\PropertyInfo\Type;
  12. use Symfony\Component\Serializer\Exception\InvalidArgumentException;
  13. use Symfony\Component\Serializer\Exception\NotNormalizableValueException;
  14. /**
  15.  * Normalizes a {@see \BackedEnum} enumeration to a string or an integer.
  16.  *
  17.  * @author Alexandre Daubois <alex.daubois@gmail.com>
  18.  */
  19. final class BackedEnumNormalizer implements NormalizerInterfaceDenormalizerInterfaceCacheableSupportsMethodInterface
  20. {
  21.     /**
  22.      * {@inheritdoc}
  23.      */
  24.     public function normalize(mixed $objectstring $format null, array $context = []): int|string
  25.     {
  26.         if (!$object instanceof \BackedEnum) {
  27.             throw new InvalidArgumentException('The data must belong to a backed enumeration.');
  28.         }
  29.         return $object->value;
  30.     }
  31.     /**
  32.      * {@inheritdoc}
  33.      */
  34.     public function supportsNormalization(mixed $datastring $format null, array $context = []): bool
  35.     {
  36.         return $data instanceof \BackedEnum;
  37.     }
  38.     /**
  39.      * {@inheritdoc}
  40.      *
  41.      * @throws NotNormalizableValueException
  42.      */
  43.     public function denormalize(mixed $datastring $typestring $format null, array $context = []): mixed
  44.     {
  45.         if (!is_subclass_of($type\BackedEnum::class)) {
  46.             throw new InvalidArgumentException('The data must belong to a backed enumeration.');
  47.         }
  48.         if (!\is_int($data) && !\is_string($data)) {
  49.             throw NotNormalizableValueException::createForUnexpectedDataType('The data is neither an integer nor a string, you should pass an integer or a string that can be parsed as an enumeration case of type '.$type.'.'$data, [Type::BUILTIN_TYPE_INTType::BUILTIN_TYPE_STRING], $context['deserialization_path'] ?? nulltrue);
  50.         }
  51.         try {
  52.             return $type::from($data);
  53.         } catch (\ValueError $e) {
  54.             throw new InvalidArgumentException('The data must belong to a backed enumeration of type '.$type);
  55.         }
  56.     }
  57.     /**
  58.      * {@inheritdoc}
  59.      */
  60.     public function supportsDenormalization(mixed $datastring $typestring $format null, array $context = []): bool
  61.     {
  62.         return is_subclass_of($type\BackedEnum::class);
  63.     }
  64.     /**
  65.      * {@inheritdoc}
  66.      */
  67.     public function hasCacheableSupportsMethod(): bool
  68.     {
  69.         return true;
  70.     }
  71. }