Symfony2 Ограничитель валидатора GreaterThan на другое свойство

Мои проверки определены в файле yaml, например;

# src/My/Bundle/Resources/config/validation.yml My\Bundle\Model\Foo: properties: id: - NotBlank: groups: [add] min_time: - Range: min: 0 max: 99 minMessage: "Min time must be greater than {{ limit }}" maxMessage: "Min time must be less than {{ limit }}" groups: [add] max_time: - GreaterThan: value: min_time groups: [add] 

Как использовать ограничение валидатора GreaterThan для проверки другого свойства?
Например, убедитесь, что max_time больше min_time?

Я знаю, что могу создать настраиваемый GreaterThan ограничений, но вы можете сделать это с использованием ограничения GreaterThan .
Надеюсь, я пропустил что-то очень простое здесь

Я предлагаю вам взглянуть на пользовательский валидатор , особенно на валидатор ограничений классов .

Я не буду копировать весь код, просто те части, которые вам придется изменить.

SRC / My / Bundle \ Model \ Foo / Validator / Ограничения / CheckTime.php

Определите валидатор, min_time и max_time – это 2 поля, которые вы хотите проверить.

 <?php namespace My\Bundle\Validator\Constraints; use Symfony\Component\Validator\Constraint; /** * @Annotation */ class CheckTime extends Constraint { public $message = 'Max time must be greater than min time'; public function validatedBy() { return 'CheckTimeValidator'; } public function getTargets() { return self::CLASS_CONSTRAINT; } } 

SRC / My / Bundle / Validator / Ограничения / CheckTimeValidator.php

Определите валидатор:

 <?php namespace My\Bundle\Validator\Constraints; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; class CheckTimeValidator extends ConstraintValidator { public function validate($foo, Constraint $constraint) { if ($foo->getMinTime() > $foo->getMaxTime()) { $this->context->addViolationAt('max_time', $constraint->message, array(), null); } } } 

SRC / My / Bundle / Ресурсы / конфигурации / validation.yml

Используйте валидатор:

 My\Bundle\Entity\Foo: constraints: - My\Bundle\Validator\Constraints\CheckTime: ~ 

Я предлагаю вам использовать валидатор обратного вызова . Пользовательские валидаторы работают тоже, но, вероятно, перебор, если это однократная проверка и не будет повторно использоваться в других частях приложения.

С помощью валидаторов обратного вызова вы можете определить их на одном объекте / модели и вызываться на уровне класса.

В твоем случае

 // in your My\Bundle\Model\Foo: /** * @Assert\Callback */ public function checkMaxTimeGreaterThanMin($foo, Constraint $constraint) { if ($foo->getMinTime() > $foo->getMaxTime()) { $this->context->addViolationAt('max_time', $constraint->message, array(), null); } } 

или если вы используете YAML

 My\Bundle\Model\Foo: constraints: - Callback: [checkMaxTimeGreaterThanMin]