Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[Serializer] AbstractObjectNormalizer ignores the property types of discriminated classes #32383

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 8, 2019
Merged

Conversation

sandergo90
Copy link
Contributor

Q A
Branch? 4.2
Bug fix? yes
New feature? no
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets #27607
License MIT
Doc PR

As discusses in ticket #27607, when using a discriminator map and the symfony serializer, things go wrong when having two classes in the discriminator map having the same property name. When the function validateAndDenormalize is called, the function getTypes would be called with the wrong class name.

If you take a look at the getTypes function below, I'm not even sure if we still need the part of the discriminator at this place because we already passed the class name of the discriminated class.

    /**
     * @return Type[]|null
     */
    private function getTypes(string $currentClass, string $attribute)
    {
        if (null === $this->propertyTypeExtractor) {
            return null;
        }

        if (null !== $types = $this->propertyTypeExtractor->getTypes($currentClass, $attribute)) {
            return $types;
        }

        if (null !== $this->classDiscriminatorResolver && null !== $discriminatorMapping = $this->classDiscriminatorResolver->getMappingForClass($currentClass)) {
            if ($discriminatorMapping->getTypeProperty() === $attribute) {
                return [
                    new Type(Type::BUILTIN_TYPE_STRING),
                ];
            }

            foreach ($discriminatorMapping->getTypesMapping() as $mappedClass) {
                if (null !== $types = $this->propertyTypeExtractor->getTypes($mappedClass, $attribute)) {
                    return $types;
                }
            }
        }

        return null;
    }

@nicolas-grekas
Copy link
Member

Could you please add a test case?

@sandergo90
Copy link
Contributor Author

@nicolas-grekas Added a test case ;)

@nicolas-grekas nicolas-grekas changed the title [Serializer]: AbstractObjectNormalizer ignores the property types of discriminated classes [Serializer] AbstractObjectNormalizer ignores the property types of discriminated classes Jul 8, 2019
…discriminated classes

Add tests

Remove test group

Allow null

Add quux null attribute

Add quux value to serialize test
@fabpot
Copy link
Member

fabpot commented Jul 8, 2019

@sandergo90 I let you ping me when tests pass so that I can merge.

@sandergo90
Copy link
Contributor Author

@fabpot done !

@fabpot
Copy link
Member

fabpot commented Jul 8, 2019

Thank you @sandergo90.

@fabpot fabpot merged commit 9fc56c7 into symfony:4.2 Jul 8, 2019
fabpot added a commit that referenced this pull request Jul 8, 2019
… types of discriminated classes (sandergo90)

This PR was merged into the 4.2 branch.

Discussion
----------

[Serializer] AbstractObjectNormalizer ignores the property types of discriminated classes

| Q             | A
| ------------- | ---
| Branch?       | 4.2
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #27607
| License       | MIT
| Doc PR        |

As discusses in ticket #27607, when using a discriminator map and the symfony serializer, things go wrong when having two classes in the discriminator map having the same property name. When the function ```validateAndDenormalize``` is called, the function ```getTypes``` would be called with the wrong class name.

If you take a look at the ```getTypes``` function below, I'm not even sure if we still need the part of the discriminator at this place because we already passed the class name of the discriminated class.

```
    /**
     * @return Type[]|null
     */
    private function getTypes(string $currentClass, string $attribute)
    {
        if (null === $this->propertyTypeExtractor) {
            return null;
        }

        if (null !== $types = $this->propertyTypeExtractor->getTypes($currentClass, $attribute)) {
            return $types;
        }

        if (null !== $this->classDiscriminatorResolver && null !== $discriminatorMapping = $this->classDiscriminatorResolver->getMappingForClass($currentClass)) {
            if ($discriminatorMapping->getTypeProperty() === $attribute) {
                return [
                    new Type(Type::BUILTIN_TYPE_STRING),
                ];
            }

            foreach ($discriminatorMapping->getTypesMapping() as $mappedClass) {
                if (null !== $types = $this->propertyTypeExtractor->getTypes($mappedClass, $attribute)) {
                    return $types;
                }
            }
        }

        return null;
    }
```

Commits
-------

9fc56c7 [Serializer]: AbstractObjectNormalizer ignores the property types of discriminated classes
@sandergo90 sandergo90 deleted the ticket_27607 branch July 8, 2019 07:45
This was referenced Jul 28, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants