BaseValidate内容

<?php

namespace app\validate;

use think\Exception;
use think\Validate;

class BaseValidate extends Validate
{
    /**
     * 按scene规则,获取并验证请求数据
     * @throws \Exception
     */
    public function readScene($scene)
    {
        if(!isset($this->scene[$scene])){
            throw new Exception('操作类型不存在');
        }

        if($this->scene[$scene]){
            $fields = $this->scene[$scene];
            $params = request()->param($this->scene[$scene]);

            //补充未传字段
            foreach ($fields as $f){
                if(!isset($params[$f])){
                    $params[$f] = null;
                }
            }
            $result = $this->scene($scene)->check($params);
            if(!$result){
                throw new Exception($this->error);
            }
        }
        else{
            $params=[];
        }
        return $params;
    }
}

调用

public function change()
{
    $action = request()->action();
    $params = (new \app\validate\Fee())->readScene($action);
    halt($params);
}

验证器内容

 

注意!!!

add和edit两个方法某个字段冲突时可以按照以下两种方式处理

1.requireIf 方法 ,传参传进来需要有action参数,值就是当前方法名

2.重新定义验证场景 如下sceneEdit

protected $rule = [
    'name' => 'requireIf:action,addPackage',
    'day' => 'require',
    'price' => 'require',
];

public function sceneEdit()
{
    return $this->only(['name','age'])
        ->append('name', 'min:5')
        ->remove('age', 'between')
        ->append('age', 'require|max:100');
}

遗留问题:单条数据如何避免里面查一次外面查一次