【问题标题】:php respect validation just validate if not emptyphp尊重验证只是验证如果不为空
【发布时间】:2016-06-19 11:35:26
【问题描述】:

我正在使用 php 方面的验证。 https://github.com/Respect/Validation

class UserValidator implements iValidator
{

    public function validate($object)
    {

        $userValidator = v::attribute('email', v::email())
            ->attribute('mobile', v::numeric()->length(10,12))
            ->attribute('firstName', v::stringType()->length(5,255))
            ->attribute('lastName', v::stringType()->length(5,255))
            ->attribute('userName', v::stringType()->length(5,255)->unique('users'))
            ->attribute('password', v::stringType()->length(8,16));

        $userValidator->assert($object);

    }

}

这是我的用户验证码。

用户名和密码只是必填字段。 我希望它们是必需的,并且仅当用户填写了输入时才应应用其他字段验证。 我该怎么办 ? 毕竟我已经实施了自己的规则(独特) 如果有必要,我准备制定新规则或其他任何东西。 另外,如果您知道更好的用于输入验证的 php 包,我会全力以赴。

【问题讨论】:

    标签: php validation respect-validation


    【解决方案1】:

    我没有使用过这个验证包。这可能不是最好的答案,但这是我从包文档中得到的。

    我认为oneOf() 方法会对您有所帮助,因为它充当 OR 运算符。另一种有用的方法是nullType(),它验证输入是否为空。您可以使用 nullType() 对您拥有的内容进行分组,以使该字段成为可选字段。

    class UserValidator implements iValidator
    {
    
        public function validate($object)
        {
    
            $userValidator = v::attribute('email', v::email())
                ->attribute('mobile', v::oneOf(
                    v::numeric()->length(10,12),
                    v::nullType
                ))
                ->attribute('firstName', v::oneOf(
                    v::stringType()->length(5,255),
                    v::nullType
                ))
                ->attribute('lastName', v::oneOf(
                    v::stringType()->length(5,255),
                    v::nullType
                ))
                ->attribute('userName', v::stringType()->length(5,255)->unique('users'))
                ->attribute('password', v::oneOf(
                    v::stringType()->length(8,16),
                    v::nullType
                ));
    
            $userValidator->assert($object);
    
        }
    
    }
    

    我没有测试它,但我认为它会工作。

    【讨论】:

    • 感谢您,我以一种骇人听闻的方式修复了它。默认情况下,如果没有为字段提供值,它不是对象的一部分,所以它不为空,我做了 foreach 并为每个未提供的字段设置了空值。我将在您的答案中发布我的代码。
    【解决方案2】:

    我知道这是旧的,但我遇到了这个问题,有一种更简单的方法可以做你想做的事:

    class UserValidator implements iValidator
    {
        public function validate($object)
        {
            $userValidator = v::attribute('email', v::email(), false)
                ->attribute('mobile', v::numeric()->length(10,12), false)
                ->attribute('firstName', v::stringType()->length(5,255), false)
                ->attribute('lastName', v::stringType()->length(5,255), false)
                ->attribute('userName', v::stringType()->length(5,255)->unique('users'))
                ->attribute('password', v::stringType()->length(8,16));
    
            $userValidator->assert($object);
        }
    
    }
    

    attribute() 方法中有一个可选的第三个参数来强制或不强制验证:

    https://github.com/Respect/Validation/blob/master/docs/Attribute.md

    【讨论】:

    • 在断言之后如何从$userValidator 获得错误消息(如果有的话)?
    • @Shackrock 如果 assert() 失败,它会抛出 Respect\Validation\Exceptions\NestedValidationException 类型的异常
    【解决方案3】:

    这是一个老问题,但 optional() 方法会起作用。

    class UserValidator implements iValidator
    {
    
        public function validate($object)
        {
    
            $userValidator = v::attribute('email', v::optional(v::email()))
                ->attribute('mobile', v::optional(v::numeric()->length(10,12)))
                ->attribute('firstName', v::optional(v::stringType()->length(5,255)))
                ->attribute('lastName', v::optional(v::stringType()->length(5,255)))
                ->attribute('userName', v::stringType()->length(5,255)->unique('users'))
                ->attribute('password', v::stringType()->length(8,16));
    
            $userValidator->assert($object);
    
        }
    
    }
    

    查看文档:https://github.com/Respect/Validation/blob/1.1/docs/Optional.md

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多