fix(laravel): validate the model instead of body #7165
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
With Eloquent, the model properties are in snake_case.
We've configured Symfony to convert camelCase to snake_case during normalization, so users send payloads like this:
However, the serializer, if you send it:
The serializer will correctly skip this property, but the HTTP Body has the field that appears to be correct.
But this causes problems with API Platform and Laravel. For instance, if we set a validation rule like this:
The request will pass validation, but it won't pass serialization, and thus it will break during database insertion (for example, with non-nullable fields).
The issue with #6932 is that as Laravel validator works on arrays, we used the HTTP Body to validate. Except that the serialization phase of API Platform should already strip some unwanted attributes.
To resolve this we moved the ValidateProvider to work on the deserialized body. With eloquent models we can use
$model->toArray()
but for non-eloquent models we need to use theObjectNormalizer
again.In this PR we also added a name conversion on validation property paths.