1. 我们更希望看到:
  2.  
  3. // 新增对象至数据表
  4. $result = $Teacher->validate(true)->save();
  5. 而不是:
  6.  
  7. // 新增对象至数据表
  8. $result = $Teacher->validate(true)->save($Teacher->getData());
  9. 原因很简单的,上面的写法才是真正的面象对象。正确的思想是:我们给一个对象赋值,然后对这个对象进行验证。显然,上面的写法更贴近我们的真实想法。
  10. ThinkPHP是一个开源的软件,我们可以在Github中,找到它的身影 。下一个贡献者会不会就是你呢?
  11. 在这里,为了更好的实现验证,我们对think\Modelthink\Validate类进行改写。
  12.  
  13. 如果你并不想动框架的源代码,那么可以略过下面本节中我们下面要讲的内容。只需要在以后涉及到验证操作时,使用$Teacher->validate(true)->save($Teacher->getData());即可。
  14. 一、think\Model类文件的位于thinkphp/library/think/Model.php 1、我们找到其中的save方法,改写前:
  15.  
  16. public function save($data = [], $where = [], $sequence = null)
  17. {
  18. if (!empty($data)) {
  19. // 数据自动验证 千锋PHP-PHP培训的实力派
  20. if (!$this->validateData($data)) {
  21. return false;
  22. }
  23. // 数据对象赋值
  24. foreach ($data as $key => $value) {
  25. $this->setAttr($key, $value, $data);
  26. }
  27. if (!empty($where)) {
  28. $this->isUpdate = true;
  29. }
  30. }
  31.  
  32. // 检测字段
  33. if (!empty($this->field)) {
  34. $this->db();
  35. foreach ($this->data as $key => $val) {
  36. if (!in_array($key, $this->field)) {
  37. unset($this->data[$key]);
  38. }
  39. }
  40. }
  41. ...
  42. 改写后:
  43.  
  44. public function save($data = [], $where = [], $sequence = null)
  45. {
  46. if (!empty($data)) {
  47. // 数据自动验证
  48. if (!$this->validateData($data)) {
  49. return false;
  50. }
  51. // 数据对象赋值
  52. foreach ($data as $key => $value) {
  53. $this->setAttr($key, $value, $data);
  54. }
  55. if (!empty($where)) {
  56. $this->isUpdate = true;
  57. }
  58.  
  59. // 未传入数据,则依新增与更新分别进行验证 --- 梦云智
  60. } else {
  61. // 更新,只验证有变化的值
  62. if ($this->isUpdate && !empty($this->change)) {
  63. foreach ($this->change as $value) {
  64. $data[$value] = $this->getData($value);
  65. }
  66.  
  67. // 新增,验证全部的值
  68. } else {
  69. $data = $this->getData();
  70. }
  71.  
  72. // 数据自动验证
  73. if (!$this->validateData($data, $this->isUpdate)) {
  74. return false;
  75. }
  76. }
  77.  
  78. // 检测字段
  79. if (!empty($this->field)) {
  80. $this->db();
  81. foreach ($this->data as $key => $val) {
  82. if (!in_array($key, $this->field)) {
  83. unset($this->data[$key]);
  84. }
  85. }
  86. }
  87. ...
  88. 2、我们再找到该文件中的validateData方法
  89. 改写前:
  90.  
  91. /**
  92. * 自动验证数据
  93. * @access protected
  94. * @param array $data 验证数据
  95. * @return bool
  96. */
  97. protected function validateData($data)
  98. ...
  99. $validate = Loader::validate($name);
  100. if (!empty($scene)) {
  101. $validate->scene($scene);
  102. }
  103. }
  104.  
  105. if (!$validate->check($data)) {
  106. ...
  107. 改写后:
  108.  
  109. /**
  110. * 自动验证数据
  111. * @access protected
  112. * @param array $data 验证数据
  113. * @param bool $isUpdate
  114. * @return bool
  115. */
  116. protected function validateData($data, $isUpdate = false)
  117. ...
  118. $validate = Loader::validate($name);
  119. if (!empty($scene)) {
  120. $validate->scene($scene);
  121. }
  122. }
  123.  
  124. // 进行数据更新操作则只验证有变化的字段 --- 梦云智
  125. if ($isUpdate) {
  126. $validate->reMakeRule($data);
  127. }
  128.  
  129. if (!$validate->check($data)) {
  130. ...
  131. 二、 think\Validate类文件的位于thinkphp/library/think/Validate.php 在类中新增reMakeRule方法,比如我在rule()方法后后面进行添加。
  132.  
  133. /**
  134. * 重新生成规则 (删除规则中不存在的更新字段规则 )
  135. * @param array $datas 要验证的数据
  136. * @return
  137. */
  138. public function reMakeRule($datas = [])
  139. {
  140. $rule = [];
  141. if (is_array($datas)) {
  142. foreach ($datas as $key => $data) {
  143. if (array_key_exists($key, $this->rule)) {
  144. $rule[$key] = $this->rule[$key];
  145. }
  146. }
  147. }
  148. $this->rule = $rule;
  149. }
  150. 有了上述代码后,我们在C层就可以这样使用了。
  151.  
  152. // 新增对象至数据表
  153. $result = $Teacher->validate(true)->save();
  154. 测试:

ThinkPHP5.0更改框架的验证方法对象->validate(true)->save();的更多相关文章

  1. ThinkPHP5.0更改框架的验证方法:对象->validate(true)->save();

    我们更希望看到: // 新增对象至数据表 $result = $Teacher->validate(true)->save(); 而不是: // 新增对象至数据表 $result = $T ...

  2. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完整版

    更新 很多小伙伴在用 IIS 发布的时候,总是会有一些问题,文章下边 #autoid-6-0-0 我也简单的动图展示了,如何 publish 到 IIS 的过程,如果你能看懂,却发现自己的项目有问题的 ...

  3. webloader上传图片详细教程/使用thinkphp5.0(原创)

    这个插件对后端程序员相当友好,无论是JAVA还是PHP,抑或python,基本只需要一句代码就能完成上传并且预览的效果,先上效果图,让你们眼馋一下 废话不说,直接撸代码,前端代码如下: <htm ...

  4. thinkphp5.0 自动加载

    自动加载 概述 ThinkPHP5.0真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载. 自动加载的实现由think\Loader类库完成,自动加载规范符 ...

  5. thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法

    这篇文章主要介绍了thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法,结合简单示例形式分析了thinkPHP5框架验证码相关配置.后台验证.前台刷新等操作技巧,学习thinkphp源码的朋 ...

  6. ThinkPHP5.0框架开发--第10章 TP5.0验证器

    ThinkPHP5.0框架开发--第10章 TP5.0验证器 第10章 TP5.0验证器 ======================================= 今日学习 1.验证器 1) 控 ...

  7. ThinkPHP5.0框架开发--第9章 TP5.0视图和模板

    ThinkPHP5.0框架开发--第9章 TP5.0视图和模板 第9章 TP5.0视图和模板 ===================================================== ...

  8. 高性能PHP框架thinkphp5.0.0 Beta发布-为API开发而设计

    ThinkPHP V5.——为API开发而设计的高性能框架 ThinkPHP5..0版本是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...

  9. 对thinkphp5.0框架的实例学习

    不论是渗透测试还是代码审计的过程中会碰到用不同的框架搭建起来的网站,熟悉这些框架的基本原理,会帮助我们快速的理解漏洞原理,提高干活效率,所以自己本地搭了个php环境,来入门实例学习下thinkphp5 ...

随机推荐

  1. 接口调用 GET方式

    /** * 第一步 视图展示 . 视图页面(忽略) * @return [type] [description] */ /** * 第二步 控制器先将要运行的接口处理好(接口及参数)传到到Model层 ...

  2. Unity 动态加载 Prefab

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  3. Extjs6(特别篇)——项目自带例子main.js拆分详解

    本文基于extjs6.0.0 一.拆分代码来看看 1.主页面main是个tab页: 写一些页面的依赖: 标明页面的controller和viewModel Ext.define('Learning.v ...

  4. bootstrap快速入门笔记(二)-栅格系统,响应式类

    一,栅格系统大致有以下: 1,行row必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,一行有12列 2.“列(column)”在水平方向创建一 ...

  5. 系统启动 之 Linux系统启动概述(1)

    随着智能终端功能的越来越庞大,与之,硬件配置越来越高,开机时间却越来越长.人们在享受强大功能的同时,对冗长的智能终端的开机时间却越来越缺乏耐心. 为了"取悦"用户,需要提供较好的用 ...

  6. HTML5和CSS3实现3D转换效果 CSS3的3D效果

    上次,我们一起研究了css3的2d模块,这次我们一起来看一下css3的3d模块. 首先,我们来了解一下3d的坐标系,x轴在屏幕上为水平方向,y轴为垂直方向,而z轴为垂直于屏幕的方向. 不理解的话可以参 ...

  7. Linux中批量添加文件和修改文件小笔记

    1.#使用通配符批量创建5个文件 $ touch file{1..10}.txt 2.#批量修改这五个后缀名为.txt的文本文件名重命名为.c后缀名结尾的文件 $ rename 's/\.txt/\. ...

  8. getRequestURI()与getRequestURL()的区别

    引于: http://hi.baidu.com/cloudxpc request.getRequestURI() 返回值类似:/xuejava/requestdemo.jsprequest.getRe ...

  9. 增强for循环 -- foreach循环

    1  作用 简化迭代器的书写格式.(注意:foreach循环的底层还是使用了迭代器遍历.) 2  适用范围 如果是实现了Iterable接口的对象或者是数组对象都可以使用foreach循环. 3  格 ...

  10. 谈谈对Spring IOC的理解(转载)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...