У меня есть следующий код:
class User
{
/**
* @Assert\Type(type="string")
* @Assert\NotBlank()
* @Assert\Email()
* @Assert\Length(max=255)
*/
public $email;
}
Этот объект заполняется из вызова API.Когда происходит проверка и свойство заполняется значением массива вместо строки, проверки NotBlank, Email и Length продолжают работать, и я получаю «UnexpectedTypeException».
Я хочу, чтобы система проверки добавила только одну ошибку о неправильном значениивведите и остановитесь там.
Я сделал пользовательский валидатор ограничений
class ChainConstraintValidator extends ConstraintValidator
{
/**
* {@inheritdoc}
*/
public function validate($value, Constraint $constraint)
{
if (!$constraint instanceof ChainConstraint) {
throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\All');
}
$context = $this->context;
$prevCount = $context->getViolations()->count();
$validator = $context->getValidator()->inContext($context);
foreach ($constraint->constraints as $constraintStep) {
$errors = $validator->validate($value, $constraintStep);
if ($errors->getViolations()->count() > $prevCount) {
break;
}
}
}
}
Это работает, и я использовал его так:
@ChainConstraint(
@Assert\Type(type="string"),
@Assert\NotBlank(),
@Assert\Email(),
@Assert\Length(max=255)
)
У меня многотакие занятия в моем проекте.Есть ли более красивый и требующий меньшего количества кода способ добиться этого?