废话
忍不住先吐槽一下,且不说TP的功能怎么样,文档写得是真的潦草,很多复杂的情况都没有举例说明。奈何网上的资料又很少,每次只能一点点去啃源码,难受的呀,常常想换个框架或者换个语言得了,但又以没时间为由懒得行动,真是自作自受呢 ≧ ﹏ ≦。
最近在工作的时候用到TP6验证器的场景里的 only、remove、append 三个方法,没想到用起来好多小问题,非常不顺手,无奈只能一个个去找具体的隐藏规则了。
正文
先附上源码路径:\vendor\topthink\framwork\src\think\Validate.php
然后说一下源码里大致的程序逻辑:
1. 先把 only+append 所有的验证规则 rule 找出来,合成一个数组。
2. 然后去 remove 里面找,如果在 remove 里面,则跳过验证。
3. 开始验证,即only+append-remove 的所有规则。
根据这个逻辑,only、remove、append 是无所谓先后顺序的。(第一个小发现)
接下来是这次试出来的几个规则,时间有限,内容还比较少,后面会在使用的过程中再慢慢补充。
1. remove 和 append 使用的前提得是需要 only 声明:
第一点虽然文档里没有明说,但是稍微试一下还是能很容易得出结论的。
//文档里的例子
public function sceneEdit()
{
return $this->only(['name','age'])
->append('name', 'min:5')
->remove('age', 'between')
->append('age', 'require|max:100');
}
稍微看一下源码,确实写的就是如果only里面没有就直接跳过。
2. remove 和 append 的用法稍有不同。append需要指定具体的规则内容,如 append('date', 'dateFormat:Y-m-d');而 remove 则只能指定规则名,如 remove('date', 'dateFormat')。
这一点虽然也能在文档给出的唯一一个例子中发现,但是藏得确实有点深,正常人可能就直接复制粘贴,结果搞了半天还是没用。(就比如说我)
具体的逻辑在源码的 checkItem 方法中能找到。大致的意思是,通过 getValidateType 这个方法,将我们传进去的规则转换成 type类型、rule具体规则、info规则,然后再去 remove 里面匹配。
//比如我原来定义了一个
protected $rule = [
'date' => 'dateFormat:Y-m-d',
]
//此时通过getValidateType返回的值是["dateFormat","Y-m-d","dateFormat"]
remove('arrival_time', 'date|dateFormat:Y-m-d') //这么使用的话就是in_array("dateFormat",["date","dateFormat:Y-m-d"]),自然就不能remove成功了
remove('arrival_time', 'date|dateFormat') //根据代码逻辑,只能这么使用
3. 在看源码的时候发现 remove 的第二个参数可以传 true,来移除该字段的所有规则。但是按照上文的说法,同一个字段是不能先 remove 再 append 的。(稍微有点可惜)