模型的获取器,修改器,自动完成和数据验证总结

Original 2018-12-17 16:19:40 362
abstract:一.模型的获取器: 就是在获取模型实例数据时自动触发的模型方法.  getFieldAttr($value,$data可选)    1.在模型文件中创建一个获取器方法 对应着一条数据的一个字段.   getData()获取某一字段的原始数据(获取器处理之前的)    如获取staff表中的

一.模型的获取器: 就是在获取模型实例数据时自动触发的模型方法.  getFieldAttr($value,$data可选)

    1.在模型文件中创建一个获取器方法 对应着一条数据的一个字段.   getData()获取某一字段的原始数据(获取器处理之前的)

    如获取staff表中的name字段,则在模型文件Staff.php中创建受保护的方法 getNameAttr($value,$data可选)方法  $value为获取字段的值 $data为这条查询数据的其他字段值 ,具体操作如下

protected function getSalaryAttr($value, $data)    //当获取salary工资字段时自动触发
{
    return $data['name'].'的工资是:'.($value+250);    //获取工资字段返回的值
}
/********************************************************************************/
    //控制器中方法
    public function gain()
    {
        $res = Staff::get(2);
//        dump($res);
        echo '<hr>';
        echo $res->salary,'<br>';
        echo $res->getData('salary');  //获取某一字段的原始值
    }

    2.也可以为获取不存在的字段时进行设置,如下

protected function getStaffInfoAttr($value,$data)    //获取不存在的字段staff_info
{
    //staff_info;虚拟字段
    //$value: 仅仅是一个占位符
    return '我是'.$data['name'].'今年都'.$data['age'].'岁了,工资才'.$data['salary'].'好可怜啊';
}

//控制器中方法
echo $res->staff_info,'<br>';

------------------------------------------------------------------------------------------------------------

二.模型修改器:就是在更新模型实例数据时自动触发的模型方法.  setFieldAttr($value,$date可选)

    1.和获取器几乎相同,就是在更新数据时自动触发

protected function setSalaryAttr($value,$data)      //更新salary字段时自动触发
{
    return $value+$data['age'];                    //返回处理后的数据
}

//控制器中方法
$res = Staff::get(3);
$res->salary = '4000';
$res->save();
/********************************************************************************/

三.模型的自动完成 : 针对写操作,当更新,新增(删除通过软删除,也属于更新)  相当于给字段设置默认值

    1.设置三个继承于think\Model类中的三个受保护的属性 $insert [新增时设置], $update  [更新时设置],  或者$auto [更新或者新增时都设置]

protected $insert = ['sex'=>0,'salary'=>1000];  //新增

protected $update = ['sex'=>0]; //更新

protected $auto = ['sex'=>0];   //新增和更新都设置

//控制器中方法
        Staff::create(['name'=>'小灭绝','age'=>60]);
        Staff::update(['name'=>'灭绝师太','age'=>24],
            function($query){
                $query->where('staff_id = 33');
        });

    2.类型转换:默认字段转为string类型输出,可以设置$type进行设置类型转换如:

protected $type = [
    'staff_id' => 'integer',
    'sex' => 'integer',
    'age' => 'integer',
    'salary'=> 'integer'
];

四.自动时间戳功能:可以当进行新增和修改是自动将时间戳写入指定的字段中

    可以在database.php中进行修改 'auto_timestamp'  => false,  这样设置就是全局配置 不推荐这么修改 

    也可以在数据表对应的模型文件中进行设置三个父类受保护的属性  $autoWriteTimestamp 是否开启自动时间戳  $createTime 创建文件的时间戳字段名  $updateTime 修改文件的时间戳字段名 

//开启当前模型的自动时间戳功能
protected $autoWriteTimestamp = true;

//设置一下用户自定义的新增和更新时间的字段名
protected $createTime = 'create_time';
protected $updateTime = 'update_time';

五.验证器: 就是创建一个验证器类来进行验证,验证器类继承于think\Validate.php  功能就是对指定数据进行数据验证

    1.创建一个验证器类,继承于think\Validate.php ,并写入对应要验证的字段的验证规则

    2.自定义验证错误信息,可以更友好的输出错误信息

    如下

namespace app\validate;
use think\Validate;

class Staff extends Validate
{
    //验证规则
    protected $rule = [
        'name' => 'require|length:4,15',
        'sex' => 'in:0,1',
        'age' => 'require|between:18,60',
        'salary'=>'require|gt:1500'
    ];

    //自定义错误信息
    protected $message = [
        'name.require'  => '员工姓名不能为空',
        'name.length'   => '员工姓名长度不在范围内(4-15字符之间)',
        'sex.in'        => '性别必须是男或女',
        'age.require'   => '年龄不能为空',
        'age.between'   => '年龄必须在18-60之间',
        'salary.require'=> '工资必须输入',
        'salary.gt'     => '工资必须大于1500',
    ];
}

   3.控制器文件:需要引入创建的验证器类;     依赖注入验证器类,调用验证器类check("验证的数据")方法 来进行验证 验证通过返回true 失败返回false  getError()方法返回对应的错误信息

namespace app\index\controller;
use think\Controller;
use app\validate\Staff; //导入验证器类

class Verify extends Controller
{
    //验证器
    public function demo1(Staff $validate)    //依赖注入
    {
        //准备一下要验证的数据
        $data  = [
            'name'=> '罗伯特唐尼',
            'sex' => 1,
            'age' => 22,
            'salary' => 5000
        ];
//        $validate = new Staff();
        if(!$validate->check($data)){
            dump($validate->getError());
        }else{
            return '验证通过';
        }
    }

    4.可以简化验证器 控制器调用父类Controller.php的方法validate($data,$rule,$message)  $data:要验证的数据,$rule:验证规则,$message:错误信息 $this->validate($data,$rule)错误返回错误信息 正确返回true

public function demo2()
{
    $data = [
        'name'=> '钢铁侠罗伯特唐尼',
        'sex' => 1,
        'age' => 18,
        'salary' => 5000
    ];
    //验证规则
    $rule = 'app\validate\Staff';    //验证器类

    $res = $this->validate($data,$rule);
    if($res !== true){
        return $res;
    }else{
        return '验证成功!';
    }
}

    5.当想处理很简单的验证规则时可以直接写入validate的参数中

$data = ['age'=>28];

$rule = ['age' => ['between:10,50','require']];

$message = ['age.between' => '年龄必须在10-50之间','age.require' => '年龄不能为空'];

$res = $this->validate($data, $rule, $message);    //直接传入数据,规则,错误信息

if($res !== true){
    return $res;
}else{
    return '验证成功!';
}

六.独立验证:就是不依赖自定义的验证类,直接引入使用think\Validate.php中的方法进行验证   Validate::make($rule,$message)  创建验证规则并返回验证对象,  验证对象->check($data)即可进行验证

use think\Validate;
public function demo3()
{
    //1.创建验证规则
    $rule = ['age'=>'require|between:20,80'];

    //2.创建错误信息
    $mess = [
        'age.require'   =>   '年龄必须填写',
        'age.between'   =>   '年龄必须在20-80之间',
    ];
    //3.创建数据
    $data = ['age' => 50];

    //Validate::make():创建验证规则并返回验证对象
    $validate = Validate::make($rule,$mess);

    //4.进行验证
    $res = $validate->check($data);

    return $res ? '验证成功' : $validate->getError();

}




Correcting teacher:韦小宝Correction time:2018-12-17 16:27:24
Teacher's summary:写的很不错哦!总结的也很完整!框架中的验证可以帮助我们快速的完整项目!

Release Notes

Popular Entries