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提供的验证规则可以满足大部分的验证需求,但是对于自定义验证规则只能通过验证文件来解决,对于同一个模型的不同场景验证目前还是没有很好的解决办法,至少我没有发现

 

posted @ 2017-01-03 14:36  潘点点  阅读(494)  评论(0编辑  收藏  举报