zoukankan      html  css  js  c++  java
  • ThinkPHP5.0更改框架的验证方法:对象->validate(true)->save();

    我们更希望看到:
    
            // 新增对象至数据表
            $result = $Teacher->validate(true)->save();
    而不是:
    
            // 新增对象至数据表
            $result = $Teacher->validate(true)->save($Teacher->getData());
    原因很简单的,上面的写法才是真正的面象对象。正确的思想是:我们给一个对象赋值,然后对这个对象进行验证。显然,上面的写法更贴近我们的真实想法。
    ThinkPHP是一个开源的软件,我们可以在Github中,找到它的身影 。下一个贡献者会不会就是你呢?
    在这里,为了更好的实现验证,我们对thinkModel及thinkValidate类进行改写。
    
    如果你并不想动框架的源代码,那么可以略过下面本节中我们下面要讲的内容。只需要在以后涉及到验证操作时,使用$Teacher->validate(true)->save($Teacher->getData());即可。
    一、thinkModel类文件的位于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)) {
    ...
    二、  thinkValidate类文件的位于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();
    测试:

  • 相关阅读:
    【小5聊】腾讯位置服务之小程序简单使用以及显示附近WC步行路线
    前端面试——JS进阶
    【小5聊】腾讯位置服务之小程序简单使用以及显示附近WC步行路线
    Node学习(三)
    HTML5 知识点总结(六)
    uniapp集成unipush监听推送,处理兼容ios在线无法收到推送通知问题以及安卓推送处理
    记一些CSS属性总结(二)
    Python getattr() 函数
    python中的__init__和__new__的区别
    干货报告:八大科技领域,280 页,InfoQ《2020 中国技术发展白皮书》开放下载...
  • 原文地址:https://www.cnblogs.com/gaohj/p/6940533.html
Copyright © 2011-2022 走看看