-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[Validator] Made it possible (again) to pass a class name to validatePropertyValue() #11498
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
Conversation
👍 |
@@ -254,10 +256,10 @@ public function validatePropertyValue($object, $propertyName, $value, $groups = | |||
foreach ($propertyMetadatas as $propertyMetadata) { | |||
$this->validateGenericNode( | |||
$value, | |||
$object, | |||
$objectOrClass, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This also means that some more methods accept object or class with changed phpdoc, like validateGenericNode
, stepThroughGroupSequence
, ExecutionContextInterface::setNode
and ExecutionContextInterface::getObject
…alidator::validatePropertyValue()
Thanks @Tobion. I changed RecursiveContextualValidator::validatePropertyValue() not to pass the class name to the private methods, this way we can leave the other methods unchanged. |
👍 |
…to validatePropertyValue() (webmozart) This PR was merged into the 2.5 branch. Discussion ---------- [Validator] Made it possible (again) to pass a class name to validatePropertyValue() | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #11139 | License | MIT | Doc PR | - In the 2.4 API it was possible to do both: ```php $validator->validatePropertyValue($object, 'propertyName', $myValue); $validator->validatePropertyValue('\Vendor\Namespace\ClassName', 'propertyName', $myValue); ``` In the 2.5 API, the second case was not supported anymore. This is fixed now. Together with the fix comes also a small change (also in the 2.4 API) which I'll demonstrate with a code snippet: ```php $metadata->addPropertyConstraint('ClassName', 'propertyName', new Callback( function ($value, $context) { var_dump($context->getRoot()); var_dump($context->getPropertyPath()); } )); $validator->validatePropertyValue('ClassName', 'propertyName', 'foobar'); ``` Before this PR, the output would be: ``` string(9) "ClassName" string(12) "propertyName" ``` This doesn't make a lot of sense, because usually the following condition holds during validation: ```php '' === $context->getPropertyPath() || $value === $propertyAccessor->getValue($context->getRoot(), $context->getPropertyPath()) ``` which obviously cannot work if root is a class name. Thus I changed the root and property path to become: ``` string(6) "foobar" string(0) "" ``` With this change, the condition holds also in this case. Commits ------- 2bf1b37 [Validator] Fixed ExpressionValidator when the validation root is not an object ef6f5f5 [Validator] Fixed: Made it possible (again) to pass a class name to Validator::validatePropertyValue()
Both tests were introduced in symfony#11498, but symfony#11485 changed the approach to testing the validator and did not include these tests.
In the 2.4 API it was possible to do both:
In the 2.5 API, the second case was not supported anymore. This is fixed now.
Together with the fix comes also a small change (also in the 2.4 API) which I'll demonstrate with a code snippet:
Before this PR, the output would be:
This doesn't make a lot of sense, because usually the following condition holds during validation:
which obviously cannot work if root is a class name. Thus I changed the root and property path to become:
With this change, the condition holds also in this case.