Мои проверки определены в файле 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
.
Надеюсь, я пропустил что-то очень простое здесь
Я предлагаю вам взглянуть на пользовательский валидатор , особенно на валидатор ограничений классов .
Я не буду копировать весь код, просто те части, которые вам придется изменить.
Определите валидатор, 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; } }
Определите валидатор:
<?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); } } }
Используйте валидатор:
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]