我们更希望看到:

        // 新增对象至数据表
$result = $Teacher->validate(true)->save();
而不是: // 新增对象至数据表
$result = $Teacher->validate(true)->save($Teacher->getData());
原因很简单的,上面的写法才是真正的面象对象。正确的思想是:我们给一个对象赋值,然后对这个对象进行验证。显然,上面的写法更贴近我们的真实想法。
ThinkPHP是一个开源的软件,我们可以在Github中,找到它的身影 。下一个贡献者会不会就是你呢?
在这里,为了更好的实现验证,我们对think\Model及think\Validate类进行改写。 如果你并不想动框架的源代码,那么可以略过下面本节中我们下面要讲的内容。只需要在以后涉及到验证操作时,使用$Teacher->validate(true)->save($Teacher->getData());即可。
一、think\Model类文件的位于thinkphp/library/think/Model.php 1、我们找到其中的save方法,改写前: public function save($data = [], $where = [], $sequence = null)
{
if (!empty($data)) {
// 数据自动验证 千锋PHP-PHP培训的实力派
if (!$this->validateData($data)) {
return false;
}
// 数据对象赋值
foreach ($data as $key => $value) {
$this->setAttr($key, $value, $data);
}
if (!empty($where)) {
$this->isUpdate = true;
}
} // 检测字段
if (!empty($this->field)) {
$this->db();
foreach ($this->data as $key => $val) {
if (!in_array($key, $this->field)) {
unset($this->data[$key]);
}
}
}
...
改写后: public function save($data = [], $where = [], $sequence = null)
{
if (!empty($data)) {
// 数据自动验证
if (!$this->validateData($data)) {
return false;
}
// 数据对象赋值
foreach ($data as $key => $value) {
$this->setAttr($key, $value, $data);
}
if (!empty($where)) {
$this->isUpdate = true;
} // 未传入数据,则依新增与更新分别进行验证 --- 梦云智
} else {
// 更新,只验证有变化的值
if ($this->isUpdate && !empty($this->change)) {
foreach ($this->change as $value) {
$data[$value] = $this->getData($value);
} // 新增,验证全部的值
} else {
$data = $this->getData();
} // 数据自动验证
if (!$this->validateData($data, $this->isUpdate)) {
return false;
}
} // 检测字段
if (!empty($this->field)) {
$this->db();
foreach ($this->data as $key => $val) {
if (!in_array($key, $this->field)) {
unset($this->data[$key]);
}
}
}
...
2、我们再找到该文件中的validateData方法
改写前: /**
* 自动验证数据
* @access protected
* @param array $data 验证数据
* @return bool
*/
protected function validateData($data)
...
$validate = Loader::validate($name);
if (!empty($scene)) {
$validate->scene($scene);
}
} if (!$validate->check($data)) {
...
改写后: /**
* 自动验证数据
* @access protected
* @param array $data 验证数据
* @param bool $isUpdate
* @return bool
*/
protected function validateData($data, $isUpdate = false)
...
$validate = Loader::validate($name);
if (!empty($scene)) {
$validate->scene($scene);
}
} // 进行数据更新操作则只验证有变化的字段 --- 梦云智
if ($isUpdate) {
$validate->reMakeRule($data);
} if (!$validate->check($data)) {
...
二、 think\Validate类文件的位于thinkphp/library/think/Validate.php 在类中新增reMakeRule方法,比如我在rule()方法后后面进行添加。 /**
* 重新生成规则 (删除规则中不存在的更新字段规则 )
* @param array $datas 要验证的数据
* @return
*/
public function reMakeRule($datas = [])
{
$rule = [];
if (is_array($datas)) {
foreach ($datas as $key => $data) {
if (array_key_exists($key, $this->rule)) {
$rule[$key] = $this->rule[$key];
}
}
}
$this->rule = $rule;
}
有了上述代码后,我们在C层就可以这样使用了。 // 新增对象至数据表
$result = $Teacher->validate(true)->save();
测试:

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. C++ 编译报错discards qualifiers [-fpermissive]

    声明了一个类 class Card { public: Card(const string&); int m_value; char m_suit; private: const static ...

  2. 简单介绍关于IOS的生命周期过程

    初步了解一下生命周期的过程: 1.通过alloc init 分配内存,初始化controller. 2.loadViewloadView方法默认实现[super loadView]如果在初始化cont ...

  3. POJ 3294 出现在至少K个字符串中的子串

    在掌握POJ 2774(两个串求最长公共子串)以及对Height数组分组后,本题还是容易想出思路的. 首先用字符集外的不同字符连接所有串,这是为了防止两个后缀在比较时超过某个字符串的分界.二分子串的长 ...

  4. bzoj1834 [ZJOI2010]网络扩容

    Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...

  5. css3 transition 和 animation实现走马灯

    这段时间在做一个App,H5的开发.页面上有公告 以走马灯的形式显示出来. 在开始直接用的marquee标签,后来发现在ios客户端,走马灯移动不够平滑,有抖动现象. 对于有强迫症的我而言是无法忍受的 ...

  6. FineReport使用总结

    一.常用函数和变量 1. 日期 1.1 now() 当前时间 1.2 today() 今天 1.3 格式化显示,插入公式 =format($$$,"yyyy年MM月dd日 HH:mm&quo ...

  7. TypeScript基本知识(为学习AngularJS2框架做个小铺垫)

    学习angularjs2框架,需要了解一些TypeScript知识点,基本了解下面这几个知识点学习AngularJS2 就够用了 1.TypeScript 1.1显示类型的定义 TypeScript类 ...

  8. C++ 元编程 —— 让编译器帮你写程序

    目录 1 C++ 中的元编程 1.1 什么是元编程 1.2 元编程在 C++ 中的位置 1.3 C++ 元编程的历史 2 元编程的语言支持 2.1 C++ 中的模板类型 2.2 C++ 中的模板参数 ...

  9. Oracle与mysql的字段类型整理

    Oralce的字段类型整理如下: Mysql的字段类型整理如下: 最后面一栏是对应JAVA的基本类型.希望对初学者有用,初学者在学习JAVA的时候,不知道怎么把JAVA的对象指向到ORALCE或者MY ...

  10. html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法

    html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法 分析: 原来是页面编码时增加了BOM,此页面后端数据主要是PHP语言,对PHP来讲PHP在设计时 ...