表单验证 nullable 规则,为什么' ‘几个空格字符串也能通过验证?
表单:
password = ‘’
password = ‘ ‘ (5个空格)
都可以通过nullable规则,这是为啥呢? 文档里只写的是允许 null .
空字符串’’ == null 可以理解,
‘ ‘5个空格(帖子显示问题,只看到1个空格)字符串也等于null? 显然不对。
那就只能是文档nullable规则描述有误或有缺失(不全面)
难道要描述为: 允许值为null或空格字符串(不是空字符串)
初学laravel,看不懂源码,求大拿把这个验证规则的源码贴一下看看,或讲讲这块是啥情况。
另外:只有表单字段名为: password 时,才不会 trim去除空格,才有此问题。 其他名称的字段,因为默认有 trim 这个中间件的缘故,多个空格字符串,就转为null啦,不影响。
由于password和password_confirmation字段不会被
\App\Http\Middleware\TrimStrings::class
中间件trim掉,但是在验证字段规则时,Illuminate\Validation\Validator
类的validateAttribute
方法会先调用isValidatable
方法来判断一组【属性、规则、属性值】是否是可验证的,isValidatable
里面会调用presentOrRuleIsImplicit
判断值是否是存在的,或者规则是否是隐式规则:if (is_string($value) && trim($value) === '') { return $this->isImplicit($rule); }
被trim后的value当然不符合这个条件,因此其实是laravel认为你这个全是空格的字符串是不存在的,跳过了验证步骤。解决方案:1. 前端不允许密码出现空格,从TrimStrings的expect数组中移除password和password_confirmation字段,2.验证规则里面加上required规则