为speedphp最新版添加 仿Yii 的简易版 数据验证 支持不同场景,自定义回调

给个意见或建议吧

扩展一个Model基类

<?php

class BaseModel extends Model{

    use ValidationRules;

    public function rules(){} 

}

/**
 * 验证参数规则
 */
trait ValidationRules{

    public $_data;
    public $errors = []; // 验证产生的错误
    public $scene = ‘default‘; // 场景 [‘update‘,‘create‘]
    private $ok = true;

    /**
     * 验证数据
     */
    public function validate($data){
        if($this->errors) $this->errors = [];
        $_rules = $this->rules();
        $this->_data = $data;
        if(!$_rules) return true;
        if(!is_array($_rules)) throw new ErrorException(‘Model::rules必须为数组‘);
        foreach($_rules as $key => $val){
            $this->checkRow($val);
        }
        return $this->ok;
    }

    public function addErrors($msg){
        $this->errors[] = $msg;
    }

    //检查一行
    private function checkRow(&$row){
        if(count($row) < 2 || !is_array($row)) throw new ErrorException(‘Model::rules格式错误‘);
        if(isset($row[‘on‘]) && is_array($row[‘on‘]) && !in_array($this->scene,$row[‘on‘])) return true;  // 如果 on  不是array 或者不是当前的场景 则忽略   如果没定义on 则是公用的
        if(is_array($row[0])){
            foreach($row[0] as $k => $v){
                $this->checkField($v,$row[1],$row);
            }
        }elseif(is_string($row[0])){
            $this->checkField($row[0],$row[1],$row);
        }else{
            throw new ErrorException(‘Model::rules格式错误‘);
        }
    }
    //检查一个字段
    private function checkField($field,&$func,&$row){
        if($func instanceof Closure){
            !$func($field,$row) && $this->ok = false;
        }elseif(is_string($func)){
            if(!method_exists($this,$func))  throw new ErrorException(‘Model的方法:‘.$func.‘ 不存在‘);
            if( $func ==‘required‘ || (isset($this->_data[$field]) && $this->_data[$field] !=‘‘)){
                !$this->$func($field,$row) && $this->ok = false;
            }
        }else{
           throw new ErrorException(‘Model::rules格式错误‘);
        }
    }

    protected function required($field,&$row){  //必须的字段不能为空  其他的类型检查 可以为空(只有当有值且不符合规则的时候才为false)
        if(isset($this->_data[$field])?$this->_data[$field]==‘‘:true){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘不能为空‘));
            return false;
        }
        return true;
    }

    protected function email($field,&$row){
        if(!preg_match( "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i", $this->_data[$field])){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
            return false;
        }
        return $this->checkLength($field,$row);
    }

    private function checkLength($field,&$row){
        if(isset($row[‘max‘])?mb_strlen($this->_data[$field]) > $row[‘max‘]:false){
            $this->addErrors($field."不能超过{$row[‘max‘]}个字");
            return false;
        }
        if(isset($row[‘min‘])?mb_strlen($this->_data[$field]) < $row[‘min‘]:false){
            $this->addErrors($field."不能少于{$row[‘min‘]}个字");
            return false;
        }
        return true;
    }

    protected function phone($field,&$row){
        if(!preg_match("/^1[34578]\d{9}$/", $this->_data[$field])){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
            return false;
        }
        return true;
    }

    protected function number($field,&$row){
        if(!preg_match(‘/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/‘, $this->_data[$field])){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
            return false;
        }
        return $this->checkLength($field,$row);
    }

    protected function integer($field,&$row){
        if(!preg_match(‘/^\s*[+-]?\d+\s*$/‘, $this->_data[$field])){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
            return false;
        }
        return $this->checkLength($field,$row);
    }

    protected function string($field,&$row){
        if (!is_string($this->_data[$field])) {
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
            return false;
        }
        return $this->checkLength($field,$row);
    }

    protected function files(){
        // ‘ext‘ ‘maxSize‘,max , Multiple
    }

    protected function identical($field,&$row){ //一致
        if(!isset($row[‘field‘])) throw new ErrorException(‘Model::identical必须定义field‘);
        if ($this->_data[$field] != $this->_data[$row[‘field‘]]){
            $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:"与{$row[‘field‘]}不一致"));
            return false;
        }
        return true;
    }

}

model中覆盖rules方法

<?php
class User extends BaseModel{

    public $table_name = "user";

    public function rules(){
        // required email phone number integer string identical
        return [
            [[‘username‘,‘password‘],‘required‘],
            [‘password2‘,‘required‘,‘on‘=>[‘create‘]],
            [‘email‘,‘email‘,‘msg‘=>‘邮箱错了‘,‘max‘=>50],
            [‘phone‘,‘phone‘],
            [‘phone‘,‘required‘,‘on‘=>[‘update‘]],
            [‘score‘,‘number‘],
            [‘tags‘,function($field,$row){
                if(!isset($this->_data[$field]) || !is_array($this->_data[$field])){
                    $this->addErrors($field.(isset($row[‘msg‘])?$row[‘msg‘]:‘格式错误‘));
                    return false;
                }
                return true
            }],
            [‘age‘,‘integer‘],
            [[‘username‘,‘password‘],‘string‘,‘max‘=>32,‘min‘=>6],
            [‘password2‘,‘identical‘,‘field‘=>‘password‘],
        ];

    }

}

Controller中调用

$model = new User();
$model->scene = ‘update‘;
// $a = $model->validate([‘username‘=>‘admin1‘,‘password‘=>‘123456‘,‘email‘=>‘[email protected]‘,‘phone‘=>‘14526396857‘,‘score‘=>2.0,‘age‘=>2,‘password2‘=>‘123456‘]);
$a = $model->validate([]);
var_dump($a);
print_r($model->errors);
时间: 2024-11-05 14:47:38

为speedphp最新版添加 仿Yii 的简易版 数据验证 支持不同场景,自定义回调的相关文章

Yii ExtendedActiveRecord 增强版 ActiveRecord 增加多数据库连接绑定功能

ExtendedActiveRecord 继承自 CActiveRecord,因此基础功能与 CActiveRecord 无异 为添加对多数据库连接的支持,增加了对 connectionName() 方法的回调,用法跟已有的 tableName() 方法一致,返回数据库连接组件名称的字符串. 如果不定义该方法,则使用默认数据库连接(db) 源码如下: class ExtendedActiveRecord extends CActiveRecord { public static $db = ar

高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具

目录 一.概述 二.效果展示 三.实现方案分析 1.第一阶段 2.第二阶段 3.第三阶段 一.概述 好久没有做业务相关的UI功能了,比较炫酷的交互效果也写的少了,最近花了2天时间写了一个简易的高仿富途牛牛组件化的功能,当然了这只是一个初步的效果,而且没有做贴图.美化等工作,但是基本的功能已经有了.本篇文章只是作为组件化的一个开始,后续还会陆续引入更多关于组件化的介绍,相信功能也会越来越丰富.除此之外,富途牛牛的一些其他高级功能也会陆续引入,不乏有k线.分时.五日.指标.自选这样的复杂功能. 自选

为Azure Web Site 添加ADFS验证支持之二 在代码里使用ADFS

下面我们来创建一个MVC 5.0的ASP.Net程序,并且将它部署到Azure Web Site上 通过Visual Studio 2015创建Web Project 在选择ASP.net模板的地方,更改验证方式   在选择验证方式时选择"Work And School Accounts",在文本框中填入 1.你公司的ADFS的Metadata的地址,这个地址可以找ADFS的管理员要到,通常如以下形式: https://{youradfs.yourcompany.com}/federa

Yii Active Record 动态数据表

Active Record(AR)是一种流行的 对象-关系映射(ORM)技术,其映射关系为 AR class:数据表 AR class property:数据表的一列 AR 实例:数据表的一条数据 所以对于常用的数据库操作(CRUD)可以转化成一种面向对象的数据操作形式. 实现一个AR类的的最简代码如下: class Post extends CActiveRecord { public static function model($className=__CLASS__) { return p

《IT蓝豹》高仿花田ios版标签移动效果

高仿花田ios版标签移动效果,长按每一个item拖动到自己想要位置后,后面位置移动补全效果 .本项目适合研究gridview拖拽效果的朋友下载.学习android动画特效.本项目主要靠DragGrid来实现,/** 在拖动的情况 */    private void onDrag(int x, int y , int rawx , int rawy) {        if (dragImageView != null) {            windowParams.alpha = 0.6

yii 插入多条数据

如何用yii一次性插入多条数据很困扰,今天努力看看源码想到了一个办法, 如有错误请及时联系我及时改正,以防误导他人, 希望看这篇博文时大家紧做参考 废话少说看代码: $db = Yii::app()->db; $transaction = $db->beginTransaction(); $command = $db->createCommand(); try { $_files = array( array('name'=>'abc', 'size'=>'12000'),

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView Universalimageloader 图片下载缓存库 https://github.com/nostra13/Android-Universal-Image-Loader ViewPagerIndicator 分页指示器 https://github.com/JakeWharton/Android-ViewPagerIndicat

yii表单的各种验证

/验证规则详细配置 public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('username', 'required' ,'message'=>'用户名必须填写'), // array('username', 'required' ,'requiredValue'=>'ab

高仿大众点评第二版

高仿大众点评第二版 项目包含Android客户端的源码,服务端的代码,数据库的代码-- 下载地址:http://www.devstore.cn/code/info/933.html 运行截图: