Skip to content

validator: comparison constraints value #10863

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

Closed

Conversation

wimme002
Copy link
Contributor

When the comparison constraints have 1 or more nodes, a ConstraintDefinitionException error is thrown in https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Constraints/AbstractComparison.php because the keys of the array in the constructor do not have a value

<value>x</value> throws a ConstraintDefinitionException in Symfony\Component\Validator\Constraints
@xabbuh
Copy link
Member

xabbuh commented Jan 10, 2019

Can you show the full error and stack trace that you got without these changes?

@wimme002
Copy link
Contributor Author

wimme002 commented Jan 11, 2019

Tried it in 2 completely different projects (sf 3.4 and 4.2) with both the same result

<?xml version="1.0" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
        http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="App\Test">
        <property name="test">
            <constraint name="EqualTo">
                <value>5</value>
            </constraint>
        </property>
    </class>
</constraint-mapping>
namespace App;

class Test
{
    public $test = 10;
}
class Service
{
    private $validator;

    public function __construct(
        ValidatorInterface $validator
    ) {
        $this->validator = $validator;
    }

    public function xxx()
    {
        $test = new Test();
        $errors = $this->validator->validate($test);
    }
}

ConstraintDefinitionException

Symfony\Component\Validator\Exception\ConstraintDefinitionException: The "Symfony\Component\Validator\Constraints\EqualTo" constraint requires either the "value" or "propertyPath" option to be set. at vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/AbstractComparison.php:41 at Symfony\Component\Validator\Constraints\AbstractComparison->__construct(array('5')) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php:86) at Symfony\Component\Validator\Mapping\Loader\AbstractLoader->newConstraint('EqualTo', array('5')) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php:94) at Symfony\Component\Validator\Mapping\Loader\XmlFileLoader->parseConstraints(object(SimpleXMLElement)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php:221) at Symfony\Component\Validator\Mapping\Loader\XmlFileLoader->loadClassMetadataFromXml(object(ClassMetadata), object(SimpleXMLElement)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php:44) at Symfony\Component\Validator\Mapping\Loader\XmlFileLoader->loadClassMetadata(object(ClassMetadata)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php:54) at Symfony\Component\Validator\Mapping\Loader\LoaderChain->loadClassMetadata(object(ClassMetadata)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Factory/LazyLoadingMetadataFactory.php:105) at Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory->getMetadataFor(object(Test)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php:328) at Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateObject(object(Test), '', array('Default'), 1, object(ExecutionContext)) (vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php:139) at Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(object(Test), null, array('Default')) (vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveValidator.php:100) at Symfony\Component\Validator\Validator\RecursiveValidator->validate(object(Test), null, null) (vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/TraceableValidator.php:65) at Symfony\Component\Validator\Validator\TraceableValidator->validate(object(Test)) (src/Infrastructure/Controller/ConverterController.php:74) at xxx\Infrastructure\Controller\ConverterController->xxx(object(Request)) (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:151) at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1) (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68) at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true) (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:200) at Symfony\Component\HttpKernel\Kernel->handle(object(Request)) (app/app.php:25)

If I dump the $options in AbstractComparison the result is

AbstractComparison.php on line 36:
array:1 [
  0 => "5"
]

@HeahDude
Copy link
Contributor

Could be a regression that should be fixed in the core instead. I can have a look at it this week-end. WDYT @xabbuh?

@xabbuh
Copy link
Member

xabbuh commented Jan 11, 2019

@HeahDude Reading the code again this seems to be intended. What should also work is this:

<?xml version="1.0" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
        http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="App\Test">
        <property name="test">
            <constraint name="EqualTo">
                <value key="value">5</value>
            </constraint>
        </property>
    </class>
</constraint-mapping>

But for this example I think that would be more confusing than the proposed change.

@javiereguiluz
Copy link
Member

@wimme002 thanks for fixing this error!

javiereguiluz added a commit that referenced this pull request Jan 17, 2019
This PR was submitted for the master branch but it was merged into the 3.4 branch instead (closes #10863).

Discussion
----------

validator: comparison constraints value

When the comparison constraints have 1 or more <value> nodes, a ConstraintDefinitionException error is thrown in https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Constraints/AbstractComparison.php because the keys of the array in the constructor do not have a value

Commits
-------

c318f85 validator: comparison constraints value
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.

5 participants