Thinkphp5把模型的验证规则归为一个验证器,这种做法,不知到符不符合大家的心意,反正楼主是比较不爽的
楼主更倾向于tp3.2的验证规则直接写在模型里面,毕竟你的验证规则一般而言是针对模型来验证的。独立出来,
个人感觉除了写多一个文件外,优点暂时没体验出来。
在写登录模块的时候,突然想到,在模型之中可以定义自动完成规则,验证器可以定义验证规则。
那么关于这两者的先后执行关系到底是怎么样?自己手动验证一下:
思路:
先在控制器里面填好数据,然后再尝试在数据库里面新增记录。通过对数据的登录帐号的信息进行不同的验证:
验证一:控制器里面不填写accounts字段,在模型里面通过自动完成规则完成accounts字段的内容填写。再在验证器的函数里面对accounts字段的内容输出。
验证二:控制器里面填写accounts字段。在模型里面通过自动完成填写accounts字段内容(与控制器不一致)
登录表的设计:
- 1 DROP TABLE IF EXISTS `tp5_user`;
- 2 /*!40101 SET @saved_cs_client = @@character_set_client */;
- 3 /*!40101 SET character_set_client = utf8 */;
- 4 CREATE TABLE `tp5_user` (
- 5 `id` int(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
- 6 `username` varchar(16) NOT NULL COMMENT '用户名',
- 7 `accounts` varchar(255) NOT NULL COMMENT '登录账户',
- 8 `password` varchar(255) NOT NULL COMMENT '登录密码',
- 9 `mobile` varchar(15) DEFAULT NULL COMMENT '手机(重置密码)',
- 10 `user_type` tinyint(4) DEFAULT '0' COMMENT '账户类型',
- 11 `status` tinyint(4) DEFAULT '1' COMMENT '状态(0禁用,1正常)',
- 12 `create_time` datetime DEFAULT NULL COMMENT '加入时间',
- 13 `update_time` datetime DEFAULT NULL COMMENT '更新时间',
- 14 PRIMARY KEY (`id`)
- 15 ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='客户表';
复制代码
模型的定义:
- 1 namespace app\index\model;
- 2
- 3 use think\Model;
- 4
- 5 class User extends Model {
- 6 protected $auto = ['accounts' => 'gxk'];
- 7 }
复制代码
验证器的定义:
- 1 namespace app\index\validate;
- 2
- 3 use think\Validate;
- 4
- 5 //测试检验器
- 6 class User extends Validate{
- 7 protected $rule = [
- 8 'username' => 'require|max:25|check_name',
- 9 'accounts' => 'check_accounts',
- 10 //'email' => 'email',
- 11 ];
- 12
- 13 protected $message = [
- 14 'username.require' => '名称必须',
- 15 'name.max' => '名称最多不能超过25个字符',
- 16 //'email.check_email' => '邮箱问题',
- 17 //'email' => '邮箱格式错误',
- 18 ];
- 19
- 20 /**
- 21 * 检测自定义的验证函数的参数
- 22 * 参数固定~~~
- 23 * @param $value 传入的该字段信息
- 24 * @param $rule 规则传入的参数信息
- 25 * @param $data 提交的所有参数信息
- 26 */
- 27 protected function check_email($value, $rule, $data){
- 28 dump($value);
- 29 dump($data);
- 30 return false;
- 31 }
- 32
- 33 protected function check_name($value, $rule, $data){
- 34 dump($data);
- 35 dump($value);
- 36 return true;
- 37 }
- 38
- 39 protected function check_accounts($value, $rule, $data){
- 40 dump($value);
- 41 return true;
- 42 }
- 43 }
复制代码
控制器:
- 1 namespace app\index\controller;
- 2
- 3 class User {
- 4 public function index(){
- 5 $user = new \app\index\model\User();
- 6 $data = ['username'=>'gxk', 'mobile'=>'13631789388', 'accounts' => 'aaa'];
- 7 // 调用当前模型对应的User验证器类进行数据验证
- 8 $result = $user->validate(true)->save($data);
- 9 if(false === $result){
- 10 // 验证失败 输出错误信息
- 11 dump($user->getError());
- 12 }
- 13 }
- 14 }
复制代码
验证j结果:
验证一:
若控制器不填写accounts字段,在验证器定义了检查accounts数据的函数check_accounts,你会发现,这个函数并没有执行,但是数据记录已经增加了
accounts字段的值为模型的自动填充值。说明:模型的自动填充在验证器之后。而且如果在规则里面定义某字段的验证规则时,若没有定义require规则,
则该字段不在提交的数据中时,验证规则不会执行(验证函数)。
验证二:
控制器填充accounts字段,然后模型自动规则填充非一致数据,发现验证函数执行,数据库写入数据。发现数据库的改字段的值是控制器的数值。说明倘若
在控制器提交的数据包含了字段的数值,则虽然模型的自动完成字段有包含该字段的数值,但是已被覆盖。 |