name: PropertyInfoLoader class_comment: null dependencies: - name: PropertyAccessExtractorInterface type: class source: Symfony\Component\PropertyInfo\PropertyAccessExtractorInterface - name: PropertyListExtractorInterface type: class source: Symfony\Component\PropertyInfo\PropertyListExtractorInterface - name: PropertyTypeExtractorInterface type: class source: Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface - name: PropertyInfoType type: class source: Symfony\Component\PropertyInfo\Type - name: TypeInfoType 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 - name: All type: class source: Symfony\Component\Validator\Constraints\All - name: NotBlank type: class source: Symfony\Component\Validator\Constraints\NotBlank - name: NotNull type: class source: Symfony\Component\Validator\Constraints\NotNull - name: Type type: class source: Symfony\Component\Validator\Constraints\Type - name: AutoMappingStrategy type: class source: Symfony\Component\Validator\Mapping\AutoMappingStrategy - name: ClassMetadata type: class source: Symfony\Component\Validator\Mapping\ClassMetadata - name: AutoMappingTrait type: class source: AutoMappingTrait properties: [] methods: - name: getPropertyTypes visibility: private parameters: - name: className - name: property comment: "# * Guesses and loads the appropriate constraints using PropertyInfo.\n\ # *\n# * @author K\xE9vin Dunglas \n# */\n# final class PropertyInfoLoader\ \ implements LoaderInterface\n# {\n# use AutoMappingTrait;\n# \n# public function\ \ __construct(\n# private PropertyListExtractorInterface $listExtractor,\n# private\ \ PropertyTypeExtractorInterface $typeExtractor,\n# private PropertyAccessExtractorInterface\ \ $accessExtractor,\n# private ?string $classValidatorRegexp = null,\n# ) {\n\ # }\n# \n# public function loadClassMetadata(ClassMetadata $metadata): bool\n\ # {\n# $className = $metadata->getClassName();\n# if (!$properties = $this->listExtractor->getProperties($className))\ \ {\n# return false;\n# }\n# \n# $loaded = false;\n# $enabledForClass = $this->isAutoMappingEnabledForClass($metadata,\ \ $this->classValidatorRegexp);\n# foreach ($properties as $property) {\n# if\ \ (false === $this->accessExtractor->isWritable($className, $property)) {\n# continue;\n\ # }\n# \n# if (!property_exists($className, $property)) {\n# continue;\n# }\n\ # \n# $types = $this->getPropertyTypes($className, $property);\n# if (null ===\ \ $types) {\n# continue;\n# }\n# \n# $enabledForProperty = $enabledForClass;\n\ # $hasTypeConstraint = false;\n# $hasNotNullConstraint = false;\n# $hasNotBlankConstraint\ \ = false;\n# $allConstraint = null;\n# foreach ($metadata->getPropertyMetadata($property)\ \ as $propertyMetadata) {\n# // Enabling or disabling auto-mapping explicitly\ \ always takes precedence\n# if (AutoMappingStrategy::DISABLED === $propertyMetadata->getAutoMappingStrategy())\ \ {\n# continue 2;\n# }\n# \n# if (AutoMappingStrategy::ENABLED === $propertyMetadata->getAutoMappingStrategy())\ \ {\n# $enabledForProperty = true;\n# }\n# \n# foreach ($propertyMetadata->getConstraints()\ \ as $constraint) {\n# if ($constraint instanceof Type) {\n# $hasTypeConstraint\ \ = true;\n# } elseif ($constraint instanceof NotNull) {\n# $hasNotNullConstraint\ \ = true;\n# } elseif ($constraint instanceof NotBlank) {\n# $hasNotBlankConstraint\ \ = true;\n# } elseif ($constraint instanceof All) {\n# $allConstraint = $constraint;\n\ # }\n# }\n# }\n# \n# if (!$enabledForProperty) {\n# continue;\n# }\n# \n# $loaded\ \ = true;\n# \n# // BC layer for PropertyTypeExtractorInterface::getTypes().\n\ # // Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed\ \ (8.0).\n# if (\\is_array($types)) {\n# $builtinTypes = [];\n# $nullable = false;\n\ # $scalar = true;\n# \n# foreach ($types as $type) {\n# $builtinTypes[] = $type->getBuiltinType();\n\ # \n# if ($scalar && !\\in_array($type->getBuiltinType(), ['int', 'float', 'string',\ \ 'bool'], true)) {\n# $scalar = false;\n# }\n# \n# if (!$nullable && $type->isNullable())\ \ {\n# $nullable = true;\n# }\n# }\n# \n# if (!$hasTypeConstraint) {\n# if (1\ \ === \\count($builtinTypes)) {\n# if ($types[0]->isCollection() && \\count($collectionValueType\ \ = $types[0]->getCollectionValueTypes()) > 0) {\n# [$collectionValueType] = $collectionValueType;\n\ # $this->handleAllConstraintLegacy($property, $allConstraint, $collectionValueType,\ \ $metadata);\n# }\n# \n# $metadata->addPropertyConstraint($property, $this->getTypeConstraintLegacy($builtinTypes[0],\ \ $types[0]));\n# } elseif ($scalar) {\n# $metadata->addPropertyConstraint($property,\ \ new Type(['type' => 'scalar']));\n# }\n# }\n# \n# if (!$nullable && !$hasNotBlankConstraint\ \ && !$hasNotNullConstraint) {\n# $metadata->addPropertyConstraint($property,\ \ new NotNull());\n# }\n# } else {\n# if ($hasTypeConstraint) {\n# continue;\n\ # }\n# \n# $type = $types;\n# $nullable = false;\n# \n# if ($type instanceof UnionType\ \ && $type->isNullable()) {\n# $nullable = true;\n# $type = $type->asNonNullable();\n\ # }\n# \n# if ($type instanceof CollectionType) {\n# $this->handleAllConstraint($property,\ \ $allConstraint, $type->getCollectionValueType(), $metadata);\n# }\n# \n# if\ \ (null !== $typeConstraint = $this->getTypeConstraint($type)) {\n# $metadata->addPropertyConstraint($property,\ \ $typeConstraint);\n# }\n# \n# if (!$nullable && !$hasNotBlankConstraint && !$hasNotNullConstraint)\ \ {\n# $metadata->addPropertyConstraint($property, new NotNull());\n# }\n# }\n\ # }\n# \n# return $loaded;\n# }\n# \n# /**\n# * BC layer for PropertyTypeExtractorInterface::getTypes().\n\ # * Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed\ \ (8.0).\n# *\n# * @return TypeInfoType|list|null" - name: getTypeConstraintLegacy visibility: private parameters: - name: builtinType - name: type comment: '# * BC layer for PropertyTypeExtractorInterface::getTypes(). # * Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed (8.0).' - name: getTypeConstraint visibility: private parameters: - name: type comment: null - name: handleAllConstraint visibility: private parameters: - name: property - name: allConstraint - name: type - name: metadata comment: null - name: handleAllConstraintLegacy visibility: private parameters: - name: property - name: allConstraint - name: propertyInfoType - name: metadata comment: '# * BC layer for PropertyTypeExtractorInterface::getTypes(). # * Can be removed as soon as PropertyTypeExtractorInterface::getTypes() is removed (8.0).' traits: - Symfony\Component\PropertyInfo\PropertyAccessExtractorInterface - Symfony\Component\PropertyInfo\PropertyListExtractorInterface - Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface - Symfony\Component\TypeInfo\Type\CollectionType - Symfony\Component\TypeInfo\Type\IntersectionType - Symfony\Component\TypeInfo\Type\ObjectType - Symfony\Component\TypeInfo\Type\UnionType - Symfony\Component\TypeInfo\TypeIdentifier - Symfony\Component\Validator\Constraints\All - Symfony\Component\Validator\Constraints\NotBlank - Symfony\Component\Validator\Constraints\NotNull - Symfony\Component\Validator\Constraints\Type - Symfony\Component\Validator\Mapping\AutoMappingStrategy - Symfony\Component\Validator\Mapping\ClassMetadata - AutoMappingTrait interfaces: - LoaderInterface