Как с помощью custom validator сделать проверку двух полей, password и confirmPassword?

177
24 июля 2021, 05:20
<?php
namespace App\Validator\Constraints;
use App\DTO\SignupDTO;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class ConfirmPasswordValidator extends ConstraintValidator
{
    private $signupFormPassword;
    public function __construct(SignupDTO $signupFormPassword)
    {
        $this->signupFormPassword = $signupFormPassword;
    }
    public function validate($value, Constraint $constraint)
    {
        if ($this->signupFormPassword->getPassword($value) != $this->signupFormPassword->getConfirmPassword($value))
        {
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ value }}', $value)
                ->addViolation();
        }
    }   
}

аргумент $value принимает значение только первого свойства. Как правильно применить это ко второму свойству?

Answer 1

Ответ был найден собственно в самой документации symfony. Ссылка, https://symfony.com/doc/current/validation/custom_constraint.html#class-constraint-validator

Прежде всего, нужно было добавить метод getTargets() к Constraint.class, который может иметь весь класс в качестве своей области действия:

<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
 * @Annotation
 */
class ConfirmPassword extends Constraint
{
    public $message = 'Поле пароль не совпадает с полем подтверждения пароля.';
    public function validatedBy()
    {
        return \get_class($this).'Validator';
    }
    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}

При этом метод валидатора validate() получает объект в качестве первого аргумента:

<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class ConfirmPasswordValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {       
        if ($value->getPassword() != $value->getConfirmPassword())
        {
            $this->context->buildViolation($constraint->message)
                ->atPath('password')
                ->addViolation();
        }
    }   
}

Валидатор ограничения класса применяется к самому классу, а не к свойству:

<?php
namespace App\DTO;
use JMS\Serializer\Annotation\Type;
use App\Validator\Constraints as ConfirmAssert;
use Symfony\Component\Validator\Constraints as Assert;
/**
 * @ConfirmAssert\ConfirmPassword
 */
final class SignupDTO
{
}
READ ALSO
не работает $ с jquery

не работает $ с jquery

подключаю jquery на wordpress таким образом

305
Найти все ссылки одним выражением

Найти все ссылки одним выражением

Как в тексте одним выражением найти все ссылки содержащие "php" Ссылки могут быть как с href, так и просто в тексте

216
Не работает маршрутизация в Yii2 restfull api

Не работает маршрутизация в Yii2 restfull api

У меня есть проектСоздал папку api, сервер настроил так, что по адресу

127
Как запустить модуль на PHP?

Как запустить модуль на PHP?

Имею модуль для ПХП, при тесте выводит ошибку:

314