Skip to content
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

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

Merged
merged 1 commit into from Jul 8, 2019

Conversation

Projects
None yet
4 participants
@sandergo90
Copy link
Contributor

commented Jul 5, 2019

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

This comment has been minimized.

Copy link
Member

commented Jul 5, 2019

Could you please add a test case?

@sandergo90 sandergo90 force-pushed the sandergo90:ticket_27607 branch 2 times, most recently from 747a68e to 3cc4b80 Jul 8, 2019

@sandergo90

This comment has been minimized.

Copy link
Contributor Author

commented Jul 8, 2019

@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

@sandergo90 sandergo90 force-pushed the sandergo90:ticket_27607 branch 2 times, most recently from f603f30 to 1b43bdc Jul 8, 2019

[Serializer]: AbstractObjectNormalizer ignores the property types of …
…discriminated classes

Add tests

Remove test group

Allow null

Add quux null attribute

Add quux value to serialize test
@fabpot

This comment has been minimized.

Copy link
Member

commented Jul 8, 2019

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

@sandergo90 sandergo90 force-pushed the sandergo90:ticket_27607 branch from 1b43bdc to 9fc56c7 Jul 8, 2019

@sandergo90

This comment has been minimized.

Copy link
Contributor Author

commented Jul 8, 2019

@fabpot done !

@fabpot

fabpot approved these changes Jul 8, 2019

@fabpot

This comment has been minimized.

Copy link
Member

commented Jul 8, 2019

Thank you @sandergo90.

@fabpot fabpot merged commit 9fc56c7 into symfony:4.2 Jul 8, 2019

3 checks passed

continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
fabbot.io Your code looks good.
Details

fabpot added a commit that referenced this pull request Jul 8, 2019

bug #32383 [Serializer] AbstractObjectNormalizer ignores the property…
… 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 sandergo90:ticket_27607 branch Jul 8, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.