ThinkPhp5.0模型验证规则
Tp5提供了模型数据规则的验证功能,用于在数据save或者update前验证数据的有效性.Tp5提供校验规则的类为\Think\Validate,默认提供的校验规则可以查看该文件。
在Model文件中我们可以为每个Model编写校验规则比如:
<?php protected $validate=[ "rule"=>[ "pingpai"=>"require|alpha", "shangjia"=>"require", "createtime"=>"require" ], "msg"=>[ "pingpai.require"=>"请填写品牌名称", "pingpai.alpha"=>"品牌名称只支持字母", "shangjia"=>"请填写商家名称", "createtime"=>"请填写创建时间" ] ];
在Model的校验规则中主要分成两部分:rule(提示信息) 以及msg(提示信息)
,对于多个校验规则用“|”隔开,在提示信息中可以用"name.ruletype"作为key值来提供提示信息。当然我们也可以不写提示信息,利用Think\Vaildate提供的typeMsg来获取提示信息,这里需要注意在typeMsg中需要将":attribute"转换成对应的校验字段名称,可以按照如下方式编写校验规则
<?php protected $validate=[ "rule"=>[ "pingpai|品牌名称"=>"require|alpha", "shangjia|商家名称"=>"require", "createtime|创建时间"=>"require" ], "msg"=>[ ] ]; ?>
如果我们需要校验有对照值的字段,比如我们要校验商品价格,使商品价格不能小于10元可以按照以下规则写:
<?php protected $validate=[ "rule"=>[ "price|商品价格"=>"require|egt:10" ], "msg"=>[ ] ]; ?>
Tp5还提供了另外一种验证方法:
<?php protected $validate=[ "rule"=>[ ["pingpai","require","请填写品牌名称"], //单个名称以及验证规则 ["shangjia","require|alpha","请填写商家名称|商家名称必须为字母"], //多个验证规则以及提示信息 ["price|创建时间","require|lt:10"] //没有提示信息需要在验证字段后面加上验证的名称 ], "msg"=>[ ] ]; ?>
到这里,利用Tp5提供的验证规则,我们可以操作大部分的验证规则。但是有两个问题还是没有解决:
1、如果Tp5提供的验证规则不能验证我想要验证的东西呢,比如我想验证用户提交的手机号码是否是正确的,那该怎么办呢
2、验证的场景不同,比如在注册用户的时候我需要验证username,email,password,而在用户登录的时候我只需要验证username,password,这个 时候又该怎么办呢?
Tp5为了解决以上两个问题提供了一个解决方案,为模型匹配一个验证规则文件:
<?php protected $validate="PingpaiValidate"; ?>
看上面代码,我已经为Pingpai这个model指定了一个验证文件"PingpaiValidate",这个文件存放的位置应当放在当前模块的validate目录下面
需要注意的是,如果在不同的模块中需要使用Model的验证文件,那就需要在每个模块的validate目录下生成一个验证文件,当然也可以都指向同一个模块,那就需要在model文件中指定验证文件的Module:
<?php protected $validate="Index/PingpaiValidate"; ?>
上面的代码就是我为Pingpai这个model指定到Index模块中。在来看PingpaiValidate这个文件
<?php namespace app\index\validate; use think\Validate; class PingpaiValidate extends Validate{ protected $rule= [ ["name","checkpingpai:","请填写品牌名称"], //单个名称以及验证规则 ["shangjia","require|alpha","请填写商家名称|商家名称必须为字母"], //多个验证规则以及提示信息 ["price|商品价格","require|lt:10"] //没有提示信息需要在验证字段后面加上验证的名称 ]; public function checkpingpai(){ return false; } } ?>
可以看到上面代码中我为name这个字段设置了一个checkpingpai的验证规则,这个验证规则\Think\Validate中是没有的,没关系,直接在PingpaiValidate中写上就可以了
注:利用自定义函数是 rule里面验证规则的“:”千万不要丢
现在,我们还需要讨论的一个验证问题就是场景问题,对于模型的数据操作,我们在不同场景下去操作数据,可能需要验证的字段或者规则不同,在Tp5中,提供了scence比如上述例子中,在更新数据的时候,只需要更新商家名称和商品价格而商品名称不需要更新,这时候只需要提供验证场景即可在PingpaiVaildate.php中添加
protected $scene = [ "update"=>"shiangjia,price" ];
如果我需要重载验证规则改怎么办?比如我现在需要在update场景下验证价格必须大于10元,我们需要将上面的代码稍微改下
protected $scene = [ "update"=>[ "shangjia"=>"require", "price"=>"require|gt:10" ] ];
需要注意的是按照Tp5的规则,还需要去更改模型文件Pingpai.php
<?php protected $validate="Index/PingpaiValidate.update"; ?>
好吧,看起来是不是很别扭呢?如果按照这样改就意味着一个Model只能使用一个场景了,目前我没有发现有什么好的解决方案。
总结:
Tp5提供的验证规则可以满足大部分的验证需求,但是对于自定义验证规则只能通过验证文件来解决,对于同一个模型的不同场景验证目前还是没有很好的解决办法,至少我没有发现