get('rules'); $attributes = $request->get('attributes'); array_walk($attributes, function(&$value){ if(is_array($value)) $value = $value['title']; }); if(count($rules) > 0) { $validator = Validator::make($request->input(), $rules['rules'], $rules['messages'] ?? [], $attributes); if (isset($rules['custom']) && $rules['custom']) { $param = $request->input(); if($request->route('id')){ $param['id'] = $request->route('id'); } $validator->after(function ($validator) use ($rules, &$param, &$attributes) { $data = true; if(is_array($rules['custom'])){ foreach ($rules['custom'] as $callback){ $data = $this->validate(explode(',', $callback), $param, $attributes); if($data !== true){ break; } } } else { $data = $this->validate(explode(',', $rules['custom']), $param, $attributes); } if (is_array($data)) { $validator->errors()->add($data['field'], $data['message']); } }); } if ($validator->fails()) { return response()->json(['code' => 422, 'msg' => $validator->errors()->first(), 'data' => $validator->errors()->all()], 400); } } return $next($request); } private function validate($rule, $param, $attributes) { switch ($rule[0]) { case 'exists': $model = new $rule[1](); if ($model->where($rule[2], $param[$rule[2]])->count() > 0) { return true; } else { return ['field' => 'id', 'message' => '当前信息不存在']; } break; case 'unique': $model = new $rule[1](); $msg = $attributes[$rule[2]]; $model = $model->where($rule[2], $param[$rule[2]]); if((count($rule)) >= 4){ foreach ($rule as $key => $item){ if($item == 'id'){ $model = $model->where('id', '<>', $param['id']); } else if($key > 2){ $msg .= '--'. $attributes[$item]; $model = $model->where($item, $param[$item]); } } } if ($model->count() > 0) { return ['field' => 'id', 'message' => $msg .' 字段已存在']; } else { return true; } break; case 'ip_check': $model = new $rule[1](); $ip_addrs = explode(',', $model->where('name', $rule[2])->value('content')); if (in_array(MyLib::GetClientIP(), $ip_addrs)) { return true; } else { return ['field' => 'ip', 'message' => '禁止外网访问']; } break; case 'regx': $pattern = config('patterns.' . $rule[1]); if(isset($pattern[$param[$rule[3]]])){ $pattern = $pattern[$param[$rule[3]]]; } if (preg_match($pattern['pattern'], $param[$rule[2]]) > 0) { return true; } else { return ['field' => '$rule[2]', 'message' => $attributes[$rule[2]] . ' 字段格式错误']; } break; } } private function calc($operator, $value1, $value2) { switch ($operator){ case 'eq': return $value1 == $value2; case 'neq': return $value1 != $value2; case 'gt': return $value1 > $value2; case 'egt': return $value1 >= $value2; case 'lt': return $value1 < $value2; case 'elt': return $value1 <= $value2; case 'heq': return $value1 === $value2; case 'nheq': return $value1 !== $value2; } } }