• Thinkphp5 模型 验证器执行顺序问题


    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 appindexmodel;
    2 
    3 use thinkModel;
    4 
    5 class User extends Model {
    6     protected $auto = ['accounts' => 'gxk'];
    7 }

    验证器的定义:

     1 namespace appindexvalidate;
     2 
     3 use thinkValidate;
     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 appindexcontroller;
     2 
     3 class User {
     4     public function index(){
     5         $user = new appindexmodelUser();
     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字段,然后模型自动规则填充非一致数据,发现验证函数执行,数据库写入数据。发现数据库的改字段的值是控制器的数值。说明倘若

    在控制器提交的数据包含了字段的数值,则虽然模型的自动完成字段有包含该字段的数值,但是已被覆盖。

  • 相关阅读:
    SQLyog连接mysql8,报错1251
    Oracle日期函数
    git 回退
    git新建分支并指定拉去远程分支
    git创建分支并拉去远端分支代码
    git创建空白分支
    Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
    SqlHelper类
    ADO.NET中的模型及对象
    MVC过滤器---异常处理过滤器
  • 原文地址:https://www.cnblogs.com/gxkB/p/7808816.html
Copyright © 2020-2023  润新知