Skip to content

[Validator] Dump Valid constraints on debug command #48840

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
Aug 14, 2023
Merged

[Validator] Dump Valid constraints on debug command #48840

merged 1 commit into from
Aug 14, 2023

Conversation

macintoshplus
Copy link
Contributor

@macintoshplus macintoshplus commented Dec 31, 2022

Q A
Branch? 5.4
Bug fix? yes
New feature? no
Deprecations? no
Tickets Fix #46544
License MIT

The command debug:validator doesn't dump the Valid constraints with the default group.

The Valid constraints with default group change the property CascadingStrategy and the TraversalStrategy on property metadata.

This patch adds the Valid constraint on debug output if the CascadingStrategy is the same as CASCADE.

@carsonbot
Copy link

Hey!

I see that this is your first PR. That is great! Welcome!

Symfony has a contribution guide which I suggest you to read.

In short:

  • Always add tests
  • Keep backward compatibility (see https://symfony.com/bc).
  • Bug fixes must be submitted against the lowest maintained branch where they apply (see https://symfony.com/releases)
  • Features and deprecations must be submitted against the 6.3 branch.

Review the GitHub status checks of your pull request and try to solve the reported issues. If some tests are failing, try to see if they are failing because of this change.

When two Symfony core team members approve this change, it will be merged and you will become an official Symfony contributor!
If this PR is merged in a lower version branch, it will be merged up to all maintained branches within a few days.

I am going to sit back now and wait for the reviews.

Cheers!

Carsonbot

@carsonbot carsonbot changed the title Dump Valid constaints on debug command #46544 [Validator] Dump Valid constaints on debug command #46544 Jan 1, 2023
@OskarStark OskarStark changed the title [Validator] Dump Valid constaints on debug command #46544 [Validator] Dump Valid constaints on debug command Jan 1, 2023
@carsonbot
Copy link

Hey!

I think @loic425 has recently worked with this code. Maybe they can help review this?

Cheers!

Carsonbot

Comment on lines 174 to 180
if (CascadingStrategy::CASCADE === $metadata->getCascadingStrategy()) {
$constraint = new Valid([], [], null, TraversalStrategy::IMPLICIT === $metadata->getTraversalStrategy());
$data[] = [
'class' => Valid::class,
'groups' => [$constraint::DEFAULT_GROUP],
'options' => $this->getConstraintOptions($constraint),
];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, @macintoshplus thanks for your this PR! It's working great! But are we sure only Valid constraints have the CascadingStrategy::CASCADE? For example, if you create custom constraints that extend the Valid constraint you gonna have this CascadingStrategy::CASCADE, but you don't want to add here the Valid constraint but the custom one.

Copy link
Contributor Author

@macintoshplus macintoshplus Jan 2, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's true, if you extend Valid annotation without changing anything, the behavior is the same as using the Valid constraint. And, your custom constraint is changed to Valid on debug command. The debug command cannot know the original constraint class name because Symfony has removed it.

See the code https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Validator/Mapping/GenericMetadata.php#L145-L155

But if you add some options or groups, the original constraint is kept by Symfony and can be displayed on the dump command output.

Symfony changes property mapping configuration with EnableAutoMapping and DisableAutoMapping (I cannot add the constraint in debug command output because the getAutoMappingStrategy function is not defined in MetadataInterface).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@macintoshplus Maybe you can check if the metadata is an instance of ClassMetadata and then getAutoMappingStragegy

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@loic425 Yes, I can.

During the investigation (thank @HeahDude), I found some other constraints with a particular behavior.

Without trying to retrieve the original constraint to display, it's possible to display class or property metadata properties differently? How?

@alexislefebvre
Copy link
Contributor

Nitpicking: the title of this PR mentions “constaints” instead of “constraints”.

@macintoshplus macintoshplus changed the title [Validator] Dump Valid constaints on debug command [Validator] Dump Valid constraints on debug command Jan 3, 2023
@nicolas-grekas
Copy link
Member

What can we do here to unlock the PR?

@macintoshplus
Copy link
Contributor Author

What can we do here to unlock the PR?

Hi Nicolas,

Thank you for your interest in this PR.

What way to display the validation constraint that changes parameters and has been removed by Symfony?

I have tried to display Valid assert in the dump command but, some others constraint is in the same situation.

IMHO two choices:

  • display parameters on top
  • display the Symfony native constraints used to change the parameters (my first choice in this PR)

I'm available on Symfony Slack (Jean-Baptiste N.) or Twitter (@jbnahan69) to discuss this in French if you want.

@macintoshplus
Copy link
Contributor Author

Hi @nicolas-grekas, @loic425,

I have changed the property options displayed on debug output.

The 3 options (cascadeStrategy, autoMappingStrategy, traversalStrategy) it's now visible before property validators.

Symfony\Component\Validator\Tests\Dummy\DummyClassOne
-----------------------------------------------------

+---------------+----------------------------------------------------+---------+------------------------------------------------------------+
| Property      | Name                                               | Groups  | Options                                                    |
+---------------+----------------------------------------------------+---------+------------------------------------------------------------+
| -             | Symfony\Component\Validator\Constraints\Expression | Default | [                                                          |
|               |                                                    |         |   "expression" => "1 + 1 = 2",                             |
|               |                                                    |         |   "message" => "This value is not valid.",                 |
|               |                                                    |         |   "payload" => null,                                       |
|               |                                                    |         |   "values" => []                                           |
|               |                                                    |         | ]                                                          |
| firstArgument | property options                                   |         | [                                                          |
|               |                                                    |         |   "cascadeStrategy" => "Cascade",                          |
|               |                                                    |         |   "autoMappingStrategy" => "Not supported",                |
|               |                                                    |         |   "traversalStrategy" => "Implicit"                        |
|               |                                                    |         | ]                                                          |
| firstArgument | Symfony\Component\Validator\Constraints\NotBlank   | Default | [                                                          |
|               |                                                    |         |   "allowNull" => false,                                    |
|               |                                                    |         |   "message" => "This value should not be blank.",          |
|               |                                                    |         |   "normalizer" => null,                                    |
|               |                                                    |         |   "payload" => null                                        |
|               |                                                    |         | ]                                                          |
| firstArgument | Symfony\Component\Validator\Constraints\Email      | Default | [                                                          |
|               |                                                    |         |   "message" => "This value is not a valid email address.", |
|               |                                                    |         |   "mode" => null,                                          |
|               |                                                    |         |   "normalizer" => null,                                    |
|               |                                                    |         |   "payload" => null                                        |
|               |                                                    |         | ]                                                          |
+---------------+----------------------------------------------------+---------+------------------------------------------------------------+

@loic425
Copy link
Contributor

loic425 commented Jul 11, 2023

@nicolas-grekas I think we need this PR first to be sure of the behaviour.

nicolas-grekas added a commit that referenced this pull request Jul 13, 2023
…d tests (loic425)

This PR was squashed before being merged into the 5.4 branch.

Discussion
----------

[Validator] Do not mock metadata factory on debug command tests

| Q             | A
| ------------- | ---
| Branch?       |  5.4
| Bug fix?      | not really, but it will be usefull to fix that command
| New feature?  | no
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |
<!--
Replace this notice by a short README for your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - Bug fixes must be submitted against the lowest maintained branch where they apply
   (lowest branches are regularly merged to upper ones so they get the fixes too).
 - Features and deprecations must be submitted against the latest branch.
 - For new features, provide some code snippets to help understand usage.
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Before #48840 I think this one could improve the tests.

Commits
-------

de6d15f [Validator] Do not mock metadata factory on debug command tests
@macintoshplus
Copy link
Contributor Author

@loic425, @nicolas-grekas I have rebased this PR and update tests.

@nicolas-grekas
Copy link
Member

Thank you @macintoshplus.

@nicolas-grekas nicolas-grekas merged commit 3bff6fe into symfony:5.4 Aug 14, 2023
@macintoshplus macintoshplus deleted the patch-1 branch August 14, 2023 22:18
This was referenced Aug 26, 2023
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.

8 participants