Lumen 的控制器基类使用 ProvidesConvenienceMethods
trait,因此可以直接在控制器中调用validate方法
public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
validate方法接收四个入参
$request Request请求类 \Illuminate\Http\Request
$rules 验证规则 数组 [‘参数’=>’规则’] ['id' => 'required']
,多个规则使用|
分隔,例如:['id' => 'required|integer']
$messages 可选参数 自定义错误信息 数组 [‘参数.规则’=>‘提示语句’] ,错误信息中可以使用:attribute占位符来替换实际的字段名,同时还有其他占位符可以使用,具体参考官方文档['id.required'=>':attribute不能为空']
,返回的错误信息为 id不能为空
,多个规则需要定义多个提示语句,例如['id.required'=>':attribute不能为空','id. integer'=>':attribute不是一个有效的整数']
$customAttributes 可选参数 定义字段别名用于替换错误信息中的:attribute
数组 [‘参数’=> ’别名‘],例如 ['id'=>'ids']
返回的required错误信息则就是 ids不能为空
[1]参考链接
示例:
public function test()
{
$result = app('request');
$this->validate($result, [
'id' => 'required|integer'
], [
'id.required' => ':attribute不能为空',
'id.integer' => ':attribute不是一个有效的整数'
], [
'id' => 'ids'
]);
//验证通过...
);
目前提供两种思路
当然两种思路也可以一起用,根据需求灵活选择
创建自定义基类 BaseValidate
定义rules 、messages、custom 方法,返回空数组,静态还是非静态都可以,本文中均使用静态形式。
protected static function rules(){
return [];
}
protected static function messages(){
return [];
}
protected static function custom(){
return [];
}
定义校验方法
/**
* 验证来自request的数据
* @param mixed ...$classList 其他验证类
* @return array
* @throws \Exception
*/
public static function check(...$classList)
{
$data = app('request')->all();
$classArray = [];
self::getClassList($classList, $classArray);
if (count($classArray) > 0) {
foreach ($classArray as $class) {
$class::checkData($data);
}
}
self::validator($data);
return $data;
}
/**
* 验证指定数据
* @param array $data 指定验证数据
* @param array ...$classList 其他验证类
* @return array
* @throws \Exception
*/
public static function checkData($data, ...$classList)
{
$classArray = [];
self::getClassList($classList, $classArray);
if (count($classArray) > 0) {
foreach ($classArray as $class) {
$class::checkData($data);
}
}
self::validator($data);
return $data;
}
//执行验证
private static function validator($data)
{
$validator = Validator::make($data, static::rule(),static:: messages(),static:: custom());
if ($validator->fails()) {
//返回所有错误
$errors = $validator->errors();
//返回其中一个错误
throw new \Exception($errors->first());
//...根据需要在此处抛出异常或返回给上一层处理
}
}
//递归遍历获取所有验证类
private static function getClassList($classList, &$classArray)
{
foreach ($classList as $item) {
if (is_array($item)) {
self::getClassList($item, $classArray);
continue;
}
$classArray[] = $item;
}
}
定义子类IdValidate 继承自定义基类,复写rules 、messages、custom 方法,messages和custom非必需
class IdValidate extends BaseValidate
{
public static function rule()
{
return [
'id' => 'required|integer',
];
}
public static function messages()
{
return [
'id.required' => ':attribute不能为空',
'id.integer' => ':attribute不是一个有效的整数'
];
}
public static function custom()
{
return [
'id' => 'ids'
];
}
}
在控制器中调用
public function test()
{
$data = IdValidate::check()
//验证通过...
);
多个验证类组合调用
public function test()
{
//...省略tokenVlidate 和 nameValidate的定义,和IdValidate一样
//一种调用格式
$data = IdValidate::check(tokenVlidate::class, nameValidate::class);
//另一种调用格式
$validateClass =[tokenVlidate::class, nameValidate::class];
$data = IdValidate::check($validateClass);
//验证通过...
);
自定义一个model基类 BaseModel,复写save方法。
protected function rules()
{
return [];
}
protected function messages()
{
return [];
}
protected function custom()
{
return [];
}
public function save(array $options = [])
{
$data = $this->getAttributes();
$validator = Validator::make($data, $this->rules(), $this->messages(), $this->custom());
if ($validator->fails()) {
$errors = $validator->errors();
throw new \Exception($errors->first());
}
return parent::save($options); // TODO: Change the autogenerated stub
}
在model中定义rules、messages、custom
class Test extends BaseModel
{
protected $table = 'test';
public function rules()
{
return [
'id' => 'required|integer',
];
}
public function messages()
{
return [
'id.required' => ':attribute不能为空',
'ids.integer' => ':attribute不是一个有效的整数'
];
}
public function custom()
{
return [
'id' => 'ids'
];
}
}
这样在执行save方法时就会对model里定义的规则进行校验,同理其他方法也是一样可以重写加规则验证。