创建 app\Http\Requests\ValidatorTrait.php
trait
namespace App\Http\Validators; | |
use Illuminate\Support\Facades\Validator; | |
trait ValidatorTrait | |
{ | |
/** | |
* 场景名称 | |
* @var null | |
*/ | |
protected $scene = null; | |
/** | |
* 只验证的规则 | |
* @var array | |
*/ | |
protected $onlyRule=[]; | |
protected static $obj=null; | |
/** | |
* 自定义错误消息 | |
* @var array | |
*/ | |
protected $massage=[ | |
"required" => ":attribute 不能为空", | |
"required_if" => ":attribute 不能为空", | |
"required_unless" => ":attribute 不能为空", | |
"required_with" => ":attribute 不能为空", | |
"between" => [ | |
'string'=>":attribute 长度必须在 :min 和 :max 之间", | |
'numeric'=>":attribute 必须在 :min 和 :max 之间", | |
], | |
"email" => ":attribute 格式错误", | |
"regex" => ":attribute 格式错误", | |
"mobile" => ":attribute 格式错误", | |
'date_format' => ':attribute 与给定的格式 :format 不符合', | |
'unique' => ':attribute 已存在', | |
'min' => ':attribute 最小长度为 :min 位', | |
'max' => ':attribute 最大长度为 :max 字符', | |
'in' => ':attribute 不在操作范围', | |
"numeric" => ":attribute 不为数字", | |
"integer" => ":attribute 不为整数", | |
"string" => ":attribute 不为字符串", | |
"date" => ":attribute 格式错误", | |
"after" => ":attribute 大于 :date", | |
"gt" => ":attribute 需大于 :value", | |
"exists" => ":attribute 数据有误", | |
"point" => ":attribute 只能保留小数点后 :num 位", | |
"digits" => ":attribute 长度为 :digits 位", | |
"digits_between" => ":attribute 长度为 :min 和 :max 之间", | |
]; | |
/** | |
* @return mixed | |
*/ | |
protected function makeValidator() | |
{ | |
$validationData = app('request'); | |
$validator = Validator::make( | |
$validationData->all(), | |
$this->getRules(), | |
$this->massage, | |
method_exists($this,'attributes') ? $this->attributes() : [] | |
); | |
if ($validator->fails()) { | |
return $this->failedValidation($validator); | |
}else{ | |
return $validationData; | |
} | |
} | |
/** | |
* 返回错误 | |
* @param $validator | |
* @return mixed | |
*/ | |
public function failedValidation($validator) | |
{ | |
return $validator->errors()->first(); | |
} | |
/** | |
* 验证方法 | |
* @param mixed $scene 场景名称或验证规则 | |
*/ | |
public function make($scene='') | |
{ | |
if(!(self::$obj instanceof self)){ | |
self::$obj = new self(); | |
} | |
if(!empty($scene)){ | |
if(is_array($scene)){ | |
self::$obj->onlyRule = $scene; | |
}else{ | |
self::$obj->scene = $scene; | |
} | |
} | |
return self::$obj->makeValidator(); | |
} | |
/** | |
* 获取 rules | |
* @return array | |
*/ | |
protected function getRules(): array | |
{ | |
return $this->handleScene(method_exists($this,'rules') ? $this->rules() : []); | |
} | |
/** | |
* 场景验证 | |
* @param array $rule | |
* @return array | |
*/ | |
protected function handleScene(array $rule = []): array | |
{ | |
if($this->onlyRule){ | |
return $this->handleRule($this->onlyRule,$rule); | |
} | |
$sceneName = $this->scene; | |
if($sceneName && method_exists($this,'scene')){ | |
$scene = $this->scene(); | |
if(array_key_exists($sceneName,$scene)) { | |
return $this->handleRule($scene[$sceneName],$rule); | |
} | |
} | |
return $rule; | |
} | |
/** | |
* 处理Rule | |
* @param array $sceneRule | |
* @param array $rule | |
* @return array | |
*/ | |
private function handleRule(array $sceneRule,array $rule): array | |
{ | |
$rules = []; | |
foreach ($sceneRule as $key => $value) { | |
if (is_numeric($key) && array_key_exists($value,$rule)) { | |
$rules[$value] = $rule[$value]; | |
} else { | |
$rules[$key] = $value; | |
} | |
} | |
return $rules; | |
} | |
} |
用法
在验证类内里 use ValidatorTrait
;
例如下面 TestValidator 验证类
namespace App\Http\Validators; | |
class TestValidator | |
{ | |
use ValidatorTrait; | |
/** | |
* 字段注解 | |
* @return array | |
*/ | |
public function attributes():array | |
{ | |
return [ | |
'name'=>'姓名', | |
'email'=>'邮件', | |
]; | |
} | |
/** | |
* 验证规则 | |
* @return array | |
*/ | |
public function rules():array | |
{ | |
return [ | |
'name' => 'required|string|unique:users', | |
'email' => 'required|email|unique:users', | |
]; | |
} | |
/** | |
* 验证场景 | |
* @return array | |
*/ | |
public function scene():array | |
{ | |
return [ | |
//add 场景 | |
'add' => [ | |
'name' , //复用 rules() 下 name 规则 | |
'email' => 'email|unique:users' //重置规则 | |
], | |
//edit场景 | |
'edit' => ['name'], | |
]; | |
} | |
} |
控制器验证
use App\Http\Validators\TestValidator; | |
public function add(Request $request){ | |
//验证所以的 | |
dd(TestValidator::make()); | |
//验证 add 场景的字段 | |
dd(TestValidator::make('add')); | |
//验证当前字段或规则 | |
dd(TestValidator::make(['id'=>['required'],'status'])); | |
} |