php - 在 Symfony 中出现第一个错误时停止对象属性验证有多漂亮?

标签 php symfony validation

我有以下代码:


    class User
    {
        /**
         * @Assert\Type(type="string")
         * @Assert\NotBlank()
         * @Assert\Email()
         * @Assert\Length(max=255)
         */
        public $email;
    }

此对象由 API 调用填充。当验证发生并且属性填充数组值而不是字符串时,NotBlank、电子邮件和长度验证继续工作,我得到“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)
    )
    

我的项目中有很多这样的类。是否有更漂亮且需要更少代码的方法来实现这一目标?

最佳答案

这个呢:

$var = [];

$constraints = [
 new Type(['type'=>'string', 'groups'=> 'first-check']),
 new NotBlank(['groups'=> 'second-check']),
 new Email(['groups'=> 'second-check']),
 new Length(['min'=>2, 'groups'=> 'second-check'])]
    ;

$groups = ['first-check', 'second-check'];
$groupSequence = new GroupSequence($groups);
$error = $validator->validate($var, $constraints, $groupSequence);

if(count($error) > 0) {
    dd($error); // Contains 1 ConstraintViolation (Type) 
 }

关于php - 在 Symfony 中出现第一个错误时停止对象属性验证有多漂亮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53969319/

相关文章:

php - UTF-8贯穿始终

vagrant - Symfony 3 + Homestead-7 : Trailing slash after app_dev. php 访问被拒绝

javascript - 在angularjs中提交时显示验证错误消息

PHP 脚本结果 500 Internal server error

php - 我怎样才能使一个 php 脚本与 Cron Job 一起永远运行?

php - 如果未登录,Wordpress 会重定向用户

php - check_phone 函数中的电话号码验证

php - 级联坚持不工作(Doctrine ORM + Symfony 2)

symfony - 使用 Symfony2 配置 behat

C++在将输入值添加到数组之前验证输入值