api/symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.yaml
2024-09-26 02:03:21 -07:00

427 lines
23 KiB
YAML

name: AbstractObjectNormalizer
class_comment: null
dependencies:
- name: PropertyAccessInvalidArgumentException
type: class
source: Symfony\Component\PropertyAccess\Exception\InvalidArgumentException
- name: InvalidTypeException
type: class
source: Symfony\Component\PropertyAccess\Exception\InvalidTypeException
- name: NoSuchPropertyException
type: class
source: Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException
- name: UninitializedPropertyException
type: class
source: Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException
- name: PropertyAccess
type: class
source: Symfony\Component\PropertyAccess\PropertyAccess
- name: PropertyTypeExtractorInterface
type: class
source: Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface
- name: LegacyType
type: class
source: Symfony\Component\PropertyInfo\Type
- name: CsvEncoder
type: class
source: Symfony\Component\Serializer\Encoder\CsvEncoder
- name: JsonEncoder
type: class
source: Symfony\Component\Serializer\Encoder\JsonEncoder
- name: XmlEncoder
type: class
source: Symfony\Component\Serializer\Encoder\XmlEncoder
- name: ExtraAttributesException
type: class
source: Symfony\Component\Serializer\Exception\ExtraAttributesException
- name: InvalidArgumentException
type: class
source: Symfony\Component\Serializer\Exception\InvalidArgumentException
- name: LogicException
type: class
source: Symfony\Component\Serializer\Exception\LogicException
- name: MissingConstructorArgumentsException
type: class
source: Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException
- name: NotNormalizableValueException
type: class
source: Symfony\Component\Serializer\Exception\NotNormalizableValueException
- name: AttributeMetadataInterface
type: class
source: Symfony\Component\Serializer\Mapping\AttributeMetadataInterface
- name: ClassDiscriminatorFromClassMetadata
type: class
source: Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata
- name: ClassDiscriminatorResolverInterface
type: class
source: Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface
- name: ClassMetadataInterface
type: class
source: Symfony\Component\Serializer\Mapping\ClassMetadataInterface
- name: ClassMetadataFactoryInterface
type: class
source: Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface
- name: NameConverterInterface
type: class
source: Symfony\Component\Serializer\NameConverter\NameConverterInterface
- name: TypeInfoLogicException
type: class
source: Symfony\Component\TypeInfo\Exception\LogicException
- name: Type
type: class
source: Symfony\Component\TypeInfo\Type
- name: CollectionType
type: class
source: Symfony\Component\TypeInfo\Type\CollectionType
- name: IntersectionType
type: class
source: Symfony\Component\TypeInfo\Type\IntersectionType
- name: ObjectType
type: class
source: Symfony\Component\TypeInfo\Type\ObjectType
- name: UnionType
type: class
source: Symfony\Component\TypeInfo\Type\UnionType
- name: TypeIdentifier
type: class
source: Symfony\Component\TypeInfo\TypeIdentifier
properties: []
methods:
- name: getAttributes
visibility: protected
parameters:
- name: object
- name: format
- name: context
comment: "# * Base class for a normalizer dealing with objects.\n# *\n# * @author\
\ K\xE9vin Dunglas <dunglas@gmail.com>\n# */\n# abstract class AbstractObjectNormalizer\
\ extends AbstractNormalizer\n# {\n# /**\n# * Set to true to respect the max depth\
\ metadata on fields.\n# */\n# public const ENABLE_MAX_DEPTH = 'enable_max_depth';\n\
# \n# /**\n# * How to track the current depth in the context.\n# */\n# public\
\ const DEPTH_KEY_PATTERN = 'depth_%s::%s';\n# \n# /**\n# * While denormalizing,\
\ we can verify that type matches.\n# *\n# * You can disable this by setting this\
\ flag to true.\n# */\n# public const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement';\n\
# \n# /**\n# * Flag to control whether fields with the value `null` should be\
\ output\n# * when normalizing or omitted.\n# */\n# public const SKIP_NULL_VALUES\
\ = 'skip_null_values';\n# \n# /**\n# * Flag to control whether uninitialized\
\ PHP>=7.4 typed class properties\n# * should be excluded when normalizing.\n\
# */\n# public const SKIP_UNINITIALIZED_VALUES = 'skip_uninitialized_values';\n\
# \n# /**\n# * Callback to allow to set a value for an attribute when the max\
\ depth has\n# * been reached.\n# *\n# * If no callback is given, the attribute\
\ is skipped. If a callable is\n# * given, its return value is used (even if null).\n\
# *\n# * The arguments are:\n# *\n# * - mixed $attributeValue value of this field\n\
# * - object $object the whole object being normalized\n# * - string $attributeName\
\ name of the attribute being normalized\n# * - string $format the requested\
\ format\n# * - array $context the serialization context\n# */\n# public\
\ const MAX_DEPTH_HANDLER = 'max_depth_handler';\n# \n# /**\n# * Specify which\
\ context key are not relevant to determine which attributes\n# * of an object\
\ to (de)normalize.\n# */\n# public const EXCLUDE_FROM_CACHE_KEY = 'exclude_from_cache_key';\n\
# \n# /**\n# * Flag to tell the denormalizer to also populate existing objects\
\ on\n# * attributes of the main object.\n# *\n# * Setting this to true is only\
\ useful if you also specify the root object\n# * in OBJECT_TO_POPULATE.\n# */\n\
# public const DEEP_OBJECT_TO_POPULATE = 'deep_object_to_populate';\n# \n# /**\n\
# * Flag to control whether an empty object should be kept as an object (in\n\
# * JSON: {}) or converted to a list (in JSON: []).\n# */\n# public const PRESERVE_EMPTY_OBJECTS\
\ = 'preserve_empty_objects';\n# \n# protected ?ClassDiscriminatorResolverInterface\
\ $classDiscriminatorResolver;\n# \n# /**\n# * @var array<string, Type|list<LegacyType>|false>\n\
# */\n# private array $typeCache = [];\n# private array $attributesCache = [];\n\
# private readonly \\Closure $objectClassResolver;\n# \n# public function __construct(\n\
# ?ClassMetadataFactoryInterface $classMetadataFactory = null,\n# ?NameConverterInterface\
\ $nameConverter = null,\n# private ?PropertyTypeExtractorInterface $propertyTypeExtractor\
\ = null,\n# ?ClassDiscriminatorResolverInterface $classDiscriminatorResolver\
\ = null,\n# ?callable $objectClassResolver = null,\n# array $defaultContext =\
\ [],\n# ) {\n# parent::__construct($classMetadataFactory, $nameConverter, $defaultContext);\n\
# \n# if (isset($this->defaultContext[self::MAX_DEPTH_HANDLER]) && !\\is_callable($this->defaultContext[self::MAX_DEPTH_HANDLER]))\
\ {\n# throw new InvalidArgumentException(\\sprintf('The \"%s\" given in the default\
\ context is not callable.', self::MAX_DEPTH_HANDLER));\n# }\n# \n# $this->defaultContext[self::EXCLUDE_FROM_CACHE_KEY]\
\ = array_merge($this->defaultContext[self::EXCLUDE_FROM_CACHE_KEY] ?? [], [self::CIRCULAR_REFERENCE_LIMIT_COUNTERS]);\n\
# \n# if ($classMetadataFactory) {\n# $classDiscriminatorResolver ??= new ClassDiscriminatorFromClassMetadata($classMetadataFactory);\n\
# }\n# $this->classDiscriminatorResolver = $classDiscriminatorResolver;\n# $this->objectClassResolver\
\ = ($objectClassResolver ?? 'get_class')(...);\n# }\n# \n# public function supportsNormalization(mixed\
\ $data, ?string $format = null, array $context = []): bool\n# {\n# return \\\
is_object($data) && !$data instanceof \\Traversable;\n# }\n# \n# public function\
\ normalize(mixed $object, ?string $format = null, array $context = []): array|string|int|float|bool|\\\
ArrayObject|null\n# {\n# $context['_read_attributes'] = true;\n# \n# if (!isset($context['cache_key']))\
\ {\n# $context['cache_key'] = $this->getCacheKey($format, $context);\n# }\n#\
\ \n# $this->validateCallbackContext($context);\n# \n# if ($this->isCircularReference($object,\
\ $context)) {\n# return $this->handleCircularReference($object, $format, $context);\n\
# }\n# \n# $data = [];\n# $stack = [];\n# $attributes = $this->getAttributes($object,\
\ $format, $context);\n# $class = ($this->objectClassResolver)($object);\n# $classMetadata\
\ = $this->classMetadataFactory?->getMetadataFor($class);\n# $attributesMetadata\
\ = $this->classMetadataFactory?->getMetadataFor($class)->getAttributesMetadata();\n\
# if (isset($context[self::MAX_DEPTH_HANDLER])) {\n# $maxDepthHandler = $context[self::MAX_DEPTH_HANDLER];\n\
# if (!\\is_callable($maxDepthHandler)) {\n# throw new InvalidArgumentException(\\\
sprintf('The \"%s\" given in the context is not callable.', self::MAX_DEPTH_HANDLER));\n\
# }\n# } else {\n# $maxDepthHandler = null;\n# }\n# \n# foreach ($attributes as\
\ $attribute) {\n# $maxDepthReached = false;\n# if (null !== $attributesMetadata\
\ && ($maxDepthReached = $this->isMaxDepthReached($attributesMetadata, $class,\
\ $attribute, $context)) && !$maxDepthHandler) {\n# continue;\n# }\n# \n# $attributeContext\
\ = $this->getAttributeNormalizationContext($object, $attribute, $context);\n\
# \n# try {\n# $attributeValue = $attribute === $this->classDiscriminatorResolver?->getMappingForMappedObject($object)?->getTypeProperty()\n\
# ? $this->classDiscriminatorResolver?->getTypeForMappedObject($object)\n# : $this->getAttributeValue($object,\
\ $attribute, $format, $attributeContext);\n# } catch (UninitializedPropertyException|\\\
Error $e) {\n# if (($context[self::SKIP_UNINITIALIZED_VALUES] ?? $this->defaultContext[self::SKIP_UNINITIALIZED_VALUES]\
\ ?? true) && $this->isUninitializedValueError($e)) {\n# continue;\n# }\n# throw\
\ $e;\n# }\n# \n# if ($maxDepthReached) {\n# $attributeValue = $maxDepthHandler($attributeValue,\
\ $object, $attribute, $format, $attributeContext);\n# }\n# \n# $stack[$attribute]\
\ = $this->applyCallbacks($attributeValue, $object, $attribute, $format, $attributeContext);\n\
# }\n# \n# foreach ($stack as $attribute => $attributeValue) {\n# $attributeContext\
\ = $this->getAttributeNormalizationContext($object, $attribute, $context);\n\
# \n# if (null === $attributeValue || \\is_scalar($attributeValue)) {\n# $data\
\ = $this->updateData($data, $attribute, $attributeValue, $class, $format, $attributeContext,\
\ $attributesMetadata, $classMetadata);\n# continue;\n# }\n# \n# if (!$this->serializer\
\ instanceof NormalizerInterface) {\n# throw new LogicException(\\sprintf('Cannot\
\ normalize attribute \"%s\" because the injected serializer is not a normalizer.',\
\ $attribute));\n# }\n# \n# $childContext = $this->createChildContext($attributeContext,\
\ $attribute, $format);\n# \n# $data = $this->updateData($data, $attribute, $this->serializer->normalize($attributeValue,\
\ $format, $childContext), $class, $format, $attributeContext, $attributesMetadata,\
\ $classMetadata);\n# }\n# \n# $preserveEmptyObjects = $context[self::PRESERVE_EMPTY_OBJECTS]\
\ ?? $this->defaultContext[self::PRESERVE_EMPTY_OBJECTS] ?? false;\n# if ($preserveEmptyObjects\
\ && !$data) {\n# return new \\ArrayObject();\n# }\n# \n# return $data;\n# }\n\
# \n# protected function instantiateObject(array &$data, string $class, array\
\ &$context, \\ReflectionClass $reflectionClass, array|bool $allowedAttributes,\
\ ?string $format = null): object\n# {\n# if ($class !== $mappedClass = $this->getMappedClass($data,\
\ $class, $context)) {\n# return $this->instantiateObject($data, $mappedClass,\
\ $context, new \\ReflectionClass($mappedClass), $allowedAttributes, $format);\n\
# }\n# \n# return parent::instantiateObject($data, $class, $context, $reflectionClass,\
\ $allowedAttributes, $format);\n# }\n# \n# /**\n# * Gets and caches attributes\
\ for the given object, format and context.\n# *\n# * @return string[]"
- name: validateAndDenormalizeLegacy
visibility: private
parameters:
- name: types
- name: currentClass
- name: attribute
- name: data
- name: format
- name: context
comment: "# * Extracts attributes to normalize from the class of the given object,\
\ format and context.\n# *\n# * @return string[]\n# */\n# abstract protected function\
\ extractAttributes(object $object, ?string $format = null, array $context = []):\
\ array;\n# \n# /**\n# * Gets the attribute value.\n# */\n# abstract protected\
\ function getAttributeValue(object $object, string $attribute, ?string $format\
\ = null, array $context = []): mixed;\n# \n# public function supportsDenormalization(mixed\
\ $data, string $type, ?string $format = null, array $context = []): bool\n# {\n\
# return class_exists($type) || (interface_exists($type, false) && null !== $this->classDiscriminatorResolver?->getMappingForClass($type));\n\
# }\n# \n# public function denormalize(mixed $data, string $type, ?string $format\
\ = null, array $context = []): mixed\n# {\n# $context['_read_attributes'] = false;\n\
# \n# if (!isset($context['cache_key'])) {\n# $context['cache_key'] = $this->getCacheKey($format,\
\ $context);\n# }\n# \n# $this->validateCallbackContext($context);\n# \n# if (null\
\ === $data && isset($context['value_type']) && ($context['value_type'] instanceof\
\ Type || $context['value_type'] instanceof LegacyType) && $context['value_type']->isNullable())\
\ {\n# return null;\n# }\n# \n# if (XmlEncoder::FORMAT === $format && !\\is_array($data))\
\ {\n# $data = ['#' => $data];\n# }\n# \n# $allowedAttributes = $this->getAllowedAttributes($type,\
\ $context, true);\n# $normalizedData = $this->prepareForDenormalization($data);\n\
# $extraAttributes = [];\n# \n# $mappedClass = $this->getMappedClass($normalizedData,\
\ $type, $context);\n# \n# $nestedAttributes = $this->getNestedAttributes($mappedClass);\n\
# $nestedData = $originalNestedData = [];\n# $propertyAccessor = PropertyAccess::createPropertyAccessor();\n\
# foreach ($nestedAttributes as $property => $serializedPath) {\n# if (null ===\
\ $value = $propertyAccessor->getValue($normalizedData, $serializedPath)) {\n\
# continue;\n# }\n# $convertedProperty = $this->nameConverter ? $this->nameConverter->normalize($property,\
\ $mappedClass, $format, $context) : $property;\n# $nestedData[$convertedProperty]\
\ = $value;\n# $originalNestedData[$property] = $value;\n# $normalizedData = $this->removeNestedValue($serializedPath->getElements(),\
\ $normalizedData);\n# }\n# \n# $normalizedData = $nestedData + $normalizedData;\n\
# \n# $object = $this->instantiateObject($normalizedData, $mappedClass, $context,\
\ new \\ReflectionClass($mappedClass), $allowedAttributes, $format);\n# $resolvedClass\
\ = ($this->objectClassResolver)($object);\n# \n# foreach ($normalizedData as\
\ $attribute => $value) {\n# if ($this->nameConverter) {\n# $notConverted = $attribute;\n\
# $attribute = $this->nameConverter->denormalize($attribute, $resolvedClass, $format,\
\ $context);\n# if (isset($nestedData[$notConverted]) && !isset($originalNestedData[$attribute]))\
\ {\n# throw new LogicException(\\sprintf('Duplicate values for key \"%s\" found.\
\ One value is set via the SerializedPath attribute: \"%s\", the other one is\
\ set via the SerializedName attribute: \"%s\".', $notConverted, implode('->',\
\ $nestedAttributes[$notConverted]->getElements()), $attribute));\n# }\n# }\n\
# \n# $attributeContext = $this->getAttributeDenormalizationContext($resolvedClass,\
\ $attribute, $context);\n# \n# if ((false !== $allowedAttributes && !\\in_array($attribute,\
\ $allowedAttributes, true)) || !$this->isAllowedAttribute($resolvedClass, $attribute,\
\ $format, $context)) {\n# if (!($context[self::ALLOW_EXTRA_ATTRIBUTES] ?? $this->defaultContext[self::ALLOW_EXTRA_ATTRIBUTES]))\
\ {\n# $extraAttributes[] = $attribute;\n# }\n# \n# continue;\n# }\n# \n# if ($attributeContext[self::DEEP_OBJECT_TO_POPULATE]\
\ ?? $this->defaultContext[self::DEEP_OBJECT_TO_POPULATE] ?? false) {\n# $discriminatorMapping\
\ = $this->classDiscriminatorResolver?->getMappingForMappedObject($object);\n\
# \n# try {\n# $attributeContext[self::OBJECT_TO_POPULATE] = $attribute === $discriminatorMapping?->getTypeProperty()\n\
# ? $discriminatorMapping\n# : $this->getAttributeValue($object, $attribute, $format,\
\ $attributeContext);\n# } catch (NoSuchPropertyException) {\n# } catch (UninitializedPropertyException|\\\
Error $e) {\n# if (!(($context[self::SKIP_UNINITIALIZED_VALUES] ?? $this->defaultContext[self::SKIP_UNINITIALIZED_VALUES]\
\ ?? true) && $this->isUninitializedValueError($e))) {\n# throw $e;\n# }\n# }\n\
# }\n# \n# if (null !== $type = $this->getType($resolvedClass, $attribute)) {\n\
# try {\n# // BC layer for PropertyTypeExtractorInterface::getTypes().\n# // Can\
\ be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed\
\ (8.0).\n# if (\\is_array($type)) {\n# $value = $this->validateAndDenormalizeLegacy($type,\
\ $resolvedClass, $attribute, $value, $format, $attributeContext);\n# } else {\n\
# $value = $this->validateAndDenormalize($type, $resolvedClass, $attribute, $value,\
\ $format, $attributeContext);\n# }\n# } catch (NotNormalizableValueException\
\ $exception) {\n# if (isset($context['not_normalizable_value_exceptions'])) {\n\
# $context['not_normalizable_value_exceptions'][] = $exception;\n# continue;\n\
# }\n# throw $exception;\n# }\n# }\n# \n# $value = $this->applyCallbacks($value,\
\ $resolvedClass, $attribute, $format, $attributeContext);\n# \n# try {\n# $this->setAttributeValue($object,\
\ $attribute, $value, $format, $attributeContext);\n# } catch (PropertyAccessInvalidArgumentException\
\ $e) {\n# $exception = NotNormalizableValueException::createForUnexpectedDataType(\n\
# \\sprintf('Failed to denormalize attribute \"%s\" value for class \"%s\": '.$e->getMessage(),\
\ $attribute, $resolvedClass),\n# $data,\n# $e instanceof InvalidTypeException\
\ ? [$e->expectedType] : ['unknown'],\n# $attributeContext['deserialization_path']\
\ ?? null,\n# false,\n# $e->getCode(),\n# $e\n# );\n# if (isset($context['not_normalizable_value_exceptions']))\
\ {\n# $context['not_normalizable_value_exceptions'][] = $exception;\n# continue;\n\
# }\n# throw $exception;\n# }\n# }\n# \n# if ($extraAttributes) {\n# throw new\
\ ExtraAttributesException($extraAttributes);\n# }\n# \n# return $object;\n# }\n\
# \n# abstract protected function setAttributeValue(object $object, string $attribute,\
\ mixed $value, ?string $format = null, array $context = []): void;\n# \n# /**\n\
# * Validates the submitted data and denormalizes it.\n# *\n# * BC layer for PropertyTypeExtractorInterface::getTypes().\n\
# * Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed\
\ (8.0).\n# *\n# * @param LegacyType[] $types\n# *\n# * @throws NotNormalizableValueException\n\
# * @throws ExtraAttributesException\n# * @throws MissingConstructorArgumentsException\n\
# * @throws LogicException"
- name: validateAndDenormalize
visibility: private
parameters:
- name: type
- name: currentClass
- name: attribute
- name: data
- name: format
- name: context
comment: '# * Validates the submitted data and denormalizes it.
# *
# * @throws NotNormalizableValueException
# * @throws ExtraAttributesException
# * @throws MissingConstructorArgumentsException
# * @throws LogicException'
- name: denormalizeParameter
visibility: protected
parameters:
- name: class
- name: parameter
- name: parameterName
- name: parameterData
- name: context
- name: format
default: 'null'
comment: '# * @internal'
- name: getType
visibility: private
parameters:
- name: currentClass
- name: attribute
comment: '# * @return Type|list<LegacyType>|null'
- name: getPropertyType
visibility: private
parameters:
- name: className
- name: property
comment: '# * BC layer for PropertyTypeExtractorInterface::getTypes().
# * Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed
(8.0).
# *
# * @return Type|list<LegacyType>|null'
- name: updateData
visibility: private
parameters:
- name: data
- name: attribute
- name: attributeValue
- name: class
- name: format
- name: context
- name: attributesMetadata
- name: classMetadata
comment: '# * Sets an attribute and apply the name converter if necessary.'
- name: isMaxDepthReached
visibility: private
parameters:
- name: attributesMetadata
- name: class
- name: attribute
- name: '&$context'
comment: '# * Is the max depth reached for the given attribute?
# *
# * @param AttributeMetadataInterface[] $attributesMetadata'
- name: createChildContext
visibility: protected
parameters:
- name: parentContext
- name: attribute
- name: format
comment: '# * Overwritten to update the cache key for the child.
# *
# * We must not mix up the attribute cache between parent and children.
# *
# * @internal'
- name: getCacheKey
visibility: private
parameters:
- name: format
- name: context
comment: '# * Builds the cache key for the attributes cache.
# *
# * The key must be different for every option in the context that could change
which attributes should be handled.'
- name: isUninitializedValueError
visibility: private
parameters:
- name: e
comment: '# * This error may occur when specific object normalizer implementation
gets attribute value
# * by accessing a public uninitialized property or by calling a method accessing
such property.'
- name: getNestedAttributes
visibility: private
parameters:
- name: class
comment: '# * Returns all attributes with a SerializedPath attribute and the respective
path.'
- name: removeNestedValue
visibility: private
parameters:
- name: path
- name: data
comment: null
- name: getMappedClass
visibility: private
parameters:
- name: data
- name: class
- name: context
comment: '# * @return class-string'
traits:
- Symfony\Component\PropertyAccess\Exception\InvalidTypeException
- Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException
- Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException
- Symfony\Component\PropertyAccess\PropertyAccess
- Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface
- Symfony\Component\Serializer\Encoder\CsvEncoder
- Symfony\Component\Serializer\Encoder\JsonEncoder
- Symfony\Component\Serializer\Encoder\XmlEncoder
- Symfony\Component\Serializer\Exception\ExtraAttributesException
- Symfony\Component\Serializer\Exception\InvalidArgumentException
- Symfony\Component\Serializer\Exception\LogicException
- Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException
- Symfony\Component\Serializer\Exception\NotNormalizableValueException
- Symfony\Component\Serializer\Mapping\AttributeMetadataInterface
- Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata
- Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface
- Symfony\Component\Serializer\Mapping\ClassMetadataInterface
- Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface
- Symfony\Component\Serializer\NameConverter\NameConverterInterface
- Symfony\Component\TypeInfo\Type
- Symfony\Component\TypeInfo\Type\CollectionType
- Symfony\Component\TypeInfo\Type\IntersectionType
- Symfony\Component\TypeInfo\Type\ObjectType
- Symfony\Component\TypeInfo\Type\UnionType
- Symfony\Component\TypeInfo\TypeIdentifier
interfaces: []