Thinkphp5 模型 验证器执行顺序问题
Thinkphp5把模型的验证规则归为一个验证器,这种做法,不知到符不符合大家的心意,反正楼主是比较不爽的
楼主更倾向于tp3.2的验证规则直接写在模型里面,毕竟你的验证规则一般而言是针对模型来验证的。独立出来,
个人感觉除了写多一个文件外,优点暂时没体验出来。
在写登录模块的时候,突然想到,在模型之中可以定义自动完成规则,验证器可以定义验证规则。
那么关于这两者的先后执行关系到底是怎么样?自己手动验证一下:
思路:
先在控制器里面填好数据,然后再尝试在数据库里面新增记录。通过对数据的登录帐号的信息进行不同的验证:
验证一:控制器里面不填写accounts字段,在模型里面通过自动完成规则完成accounts字段的内容填写。再在验证器的函数里面对accounts字段的内容输出。
验证二:控制器里面填写accounts字段。在模型里面通过自动完成填写accounts字段内容(与控制器不一致)
登录表的设计:
DROP TABLE IF EXISTS `tp5_user`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tp5_user` (
`id` int(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(16) NOT NULL COMMENT '用户名',
`accounts` varchar(255) NOT NULL COMMENT '登录账户',
`password` varchar(255) NOT NULL COMMENT '登录密码',
`mobile` varchar(15) DEFAULT NULL COMMENT '手机(重置密码)',
`user_type` tinyint(4) DEFAULT '' COMMENT '账户类型',
`status` tinyint(4) DEFAULT '' COMMENT '状态(0禁用,1正常)',
`create_time` datetime DEFAULT NULL COMMENT '加入时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='客户表';
模型的定义:
namespace app\index\model; use think\Model; class User extends Model {
protected $auto = ['accounts' => 'gxk'];
}
验证器的定义:
namespace app\index\validate; use think\Validate; //测试检验器
class User extends Validate{
protected $rule = [
'username' => 'require|max:25|check_name',
'accounts' => 'check_accounts',
//'email' => 'email',
]; protected $message = [
'username.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
//'email.check_email' => '邮箱问题',
//'email' => '邮箱格式错误',
]; /**
* 检测自定义的验证函数的参数
* 参数固定~~~
* @param $value 传入的该字段信息
* @param $rule 规则传入的参数信息
* @param $data 提交的所有参数信息
*/
protected function check_email($value, $rule, $data){
dump($value);
dump($data);
return false;
} protected function check_name($value, $rule, $data){
dump($data);
dump($value);
return true;
} protected function check_accounts($value, $rule, $data){
dump($value);
return true;
}
}
控制器:
namespace app\index\controller; class User {
public function index(){
$user = new \app\index\model\User();
$data = ['username'=>'gxk', 'mobile'=>'13631789388', 'accounts' => 'aaa'];
// 调用当前模型对应的User验证器类进行数据验证
$result = $user->validate(true)->save($data);
if(false === $result){
// 验证失败 输出错误信息
dump($user->getError());
}
}
}
验证j结果:
验证一:
若控制器不填写accounts字段,在验证器定义了检查accounts数据的函数check_accounts,你会发现,这个函数并没有执行,但是数据记录已经增加了
accounts字段的值为模型的自动填充值。说明:模型的自动填充在验证器之后。而且如果在规则里面定义某字段的验证规则时,若没有定义require规则,
则该字段不在提交的数据中时,验证规则不会执行(验证函数)。
验证二:
控制器填充accounts字段,然后模型自动规则填充非一致数据,发现验证函数执行,数据库写入数据。发现数据库的改字段的值是控制器的数值。说明倘若
在控制器提交的数据包含了字段的数值,则虽然模型的自动完成字段有包含该字段的数值,但是已被覆盖。
Thinkphp5 模型 验证器执行顺序问题的更多相关文章
- Python装饰器执行顺序详解
探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...
- Python面试题之多个装饰器执行顺序
疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子: def decorator_a(func): print 'Get in decorator_a' def ...
- Python 装饰器执行顺序迷思
Table of Contents 1. 探究多个装饰器执行顺序 1.1. 疑问 1.2. 函数和函数调用的区别 1.3. 装饰器函数在被装饰函数定义好后立即执行 1.4. 疑问的解释 2. 参考资料 ...
- Python 装饰器执行顺序
Python 装饰器执行顺序 之前同事问到两个装饰器在代码中使用顺序不同会不会有什么问题,装饰器是对被装饰的函数做了一层包装,然后执行的时候执行了被包装后的函数,例如: def decorator_a ...
- Django模型验证器详解和源码分析
转发请注明来源 在Django的模型字段参数中,有一个参数叫做validators,这个参数是用来指定当前字段需要使用的验证器,也就是对字段数据的合法性进行验证,比如大小.类型等. Django的验证 ...
- Newbe.ObjectVisitor 0.4.4 发布,模型验证器上线
Newbe.Claptrap 0.4.4 发布,模型验证器上线. 更新内容 完全基于表达式树的模型验证器 本版本,我们带来了基于表达式树实现的模型验证器.并实现了很多内置的验证方法. 我们罗列了与 F ...
- SpringMVC自定义多个拦截器执行顺序
一.正常流程下的拦截器(全部放行) 1.springMVC中拦截器实现这个接口HandlerInterceptor 第一个拦截器 HandlerInterceptor1 public class ...
- Struts2的默认拦截器执行顺序
我们在写Struts2的时候package属性默认都是差不多这样吧 <package name="packageName" namespace="/" e ...
- ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序
FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true protecte ...
随机推荐
- Qt下 QString转char*
Qt下面,字符串都用QString,确实给开发者提供了方便.Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 Qt再使用第三方开源库时,由于库的类型基本上都 ...
- UI自动化测试简介及Selenium工具的介绍和环境搭建
自动化测试简介 1.1何为自动化测试? 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程.换言之,就是以程序实现的方式来代替手工测试. 1.2自动化测试分类 分为功能自动化测 ...
- GitHub Desktop客户端打开文件乱码问题解决方案
今天在使用GitHub Desktop客户端的时候,发添加本地仓库后文件内容显示为乱码. 1.现象 如下图所示: 2.原因分析 后来分析得知原来是由于编码不统一造成 的. 具体来说,我在window ...
- 用python的TK模块实现猜成语游戏(附源码)
说明:本游戏使用到的python模块有tkinter,random,hashlib:整个游戏分为四个窗口,一个进入游戏的窗口.一个选关窗口.一个游戏进行窗口和一个游戏结束的窗口. 源码有两个主要的py ...
- Vue使用总结
好久没更新博客,确实是自己已经懒癌晚期,最近毕业刚工作3个月,公司开发一直在用Vue,自己个人也比较喜欢这个框架,今天就对自己学习到和用到的知识点作一些总结,希望能帮到大家. Vue 知道Vue也一定 ...
- scanf和gets的差别
scanf("%s", str1); scanf() 读取到空格时就认为字符串输入结束了,不会继续读取了. 第一个 scanf() 读取到 "Java" 后遇到 ...
- layer.msg 添加在Ajax之前 显示进度条。
一.使用方法:1)必须先引入jQuery1.8或以上版本 <script src="jQuery的路径"></script> <script src= ...
- win10 uwp 右击浮出窗在点击位置
本文主要让MenuFlyout出现在我们右击位置. 我们一般使用的MenuFlyout写在前台,写在Button里面,但是可能我们的MenuFlyout显示的位置和我们想要的不一样. 通过使用后台写S ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
- EF异常探究(An entity object cannot be referenced by multiple instances of IEntityChangeTracker.)
今天在改造以前旧项目时出现了一项BUG,是由于以前不规范的EF写法所导致.异常信息如下: "An entity object cannot be referenced by multiple ...