-
-
Notifications
You must be signed in to change notification settings - Fork 869
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
MutationResolverInterface no longer working properly in v3.3 #6354
Comments
thanks for the detailed report, there's nothing that said that resolvers should happen before validation but I think it's a valid behavior, I added a new test for that. |
The fix for this has been reverted, thus the bug has appeared again |
Back to this, we need to find a solution, I think it's confusing that we validate the data that gets resolved as validation should occur on the user input. |
What I've found in the meantime (maybe this is obvious to me, but it wasn't for me): setting Still, validating the entity before it is completely populated looks strange to me. By simply thinking about the semantics of that, I can't see how this is right? I know that @codedge reported this as a new problem in #6370, but I would like to know more about their use case |
Isn't the resolver supposedly have the same behavior as a provider? Anyways, I'm considering adding an option to validate after the resolver is being called, this would work for both cases. |
I'm sorry, but I don't get the question. This feature has worked for some versions, and I thought I was on the save side when implementing it just as described at https://api-platform.com/docs/core/graphql/#custom-mutations, so I'm a bit confused about why this has changed when updating from 3.2 to 3.3 |
We do not validate the entity before, but the input data. Example: Even with 3.3.5 and these settings (no entry for api_platform:
keep_legacy_inflector: false
use_symfony_listeners: true the validation does not run before reaching the resolver. We currently pin |
Same issue here, MutationResolverInterface called after validation. We used MutationResolvers for the same reason @NicoHaase uses, to populate fields before validation, like user or default status which is relation, we have cases that we need to check data and populate a fields before validation. In RestApi I did all this with PRE_VALIDATE event subscribers, in graphql there is no events, before I used WriteStage to implement PRE_VALIDATE but since api_platform.graphql.resolver.stage.write service has been moved to legacy, also that is not possible anymore. Implementing PRE_VALIDATE and POST_VALIDATE, would be a better solution for this and keep resolvers after validation. |
Can you check my PR? It adds an |
Yes, this part is working properly. Thanks for your help! I'll post an additional report, as I'm still facing a problem with security |
API Platform version(s) affected: 3.3.x
Description
In my project, I use a
MutationResolver
to set the value of the currently logged in user to an entityActivityLog
during a GraphQL mutation. The mutation itself does not contain a value for the user, instead it's loaded from Symfony's Security component. A validator ensures that the User entity assigned toActivityLog
matches some conditions.In v.3.2, this worked properly: the entity was populated properly and validated afterwards. After updating to ApiPlatform v3.3, the validation stage is already run before the MutationResolver can set the User entity. The validation fails, as the User entity on
ActivityLog
is still nullHow to reproduce
Configuration for the entity:
Configuration for the resolver:
Configuration for the validator:
Possible Solution
I'm not sure where this behaviour changed, but I would expect that the MutationResolver has finished its work before the validator is run
Additional Context
The text was updated successfully, but these errors were encountered: