文章分类模块的数据验证
前边做了文章分类的添加、编辑等,但是对于前端提交的数据没有做过任何的验证,这个是不安全的,对于任何提交的信息,后端都应该做检查,所以要做一个数据验证,lumen的数据验证和laravel基本一样,但是用法稍微有点区别,我们这里介绍lumen的数据验证。
为了保持控制器不过于臃肿,我们把数据验证独立出来,所有的数据验证逻辑都放到/app/Http/Requests/目录,Requests目录需要你新建,lumen框架中没有自带这个目录,建立这个目录也是为了和laravel保持一致。
为了便于对验证文件的管理和分类,需要在Requests目下,再建立一个Admin目录,总的路径是:/app/Http/Requests/Admin/,如下
在Admin目录下,我再建立一个Category目录,Category目录下都是分类的数据验证文件
在Category目录下,我们新建一个对新增分类做数据验证的文件AddCategory.php
<?php
namespace App\Http\Requests\Admin\Category;
class AddCategory
{
static public function rules()
{
return [];
}
static public function msg()
{
return [];
}
static public function attr()
{
return [];
}
}
有三个方法,都返回数组。第一个方法rules()是验证规则,第二个msg()是出发规则后提示的信息,第三个attr()是被验证字段的说明。
这个类是被CategoryController.php文件用的,从名字上看,这个验证文件是对新增数据做验证,所以,看代码
class CategoryController extends Controller
{
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @throws \Illuminate\Validation\ValidationException
*/
public function add(Request $request)
{
// 判断不是不post方式提交数据
if ($request->post()) {
// 对新增数据做验证
$this->validate($request, AddCategory::rules(), AddCategory::msg(), AddCategory::attr());
// 添加分类
Category::add($request->input());
return $this->response->responseJSON();
}
return view('admin.category.addCategory');
}
}
代码
$this->validate($request, AddCategory::rules(), AddCategory::msg(), AddCategory::attr());
第一个参数,是固定的,这个变量里边有前端提交的数据,第二是规则,第三个提示信息,第四个是给字段定义的属性。
现在还不能验证数据,因为规则还没有做好,我们把规则加上去。
<?php
/**
* Created by PhpStorm.
* User: Admin
* Date: 2020/1/2
* Time: 14:45
*/
namespace App\Http\Requests\Admin\Category;
class AddCategory
{
static public function rules()
{
return [
'type' => 'required|in:1,2',
'name' => 'required|string|max:20',
'dir_name' => 'required|alpha|max:20',
'pic' => 'string|max:50',
'is_nav' => 'required|in:0,1',
];
}
static public function msg()
{
return [
'type.required' => '类型不能为空',
'type.in' => '类型错误',
'name.required' => '分类名称必填',
'name.string' => '分类名称必须是字符串类型',
'name.max' => '分类名称不能超过20个字符',
'dir_name.required' => '目录名必填',
'dir_name.alpha' => '目录名必须都字母',
'dir_name.max' => '目录名不能超过20个字符',
'pic.string' => '图片地址必须是字符串',
'pic.max' => '图片地址不能超过50个字符',
'is_nav.required' => '是否作为导航不能为空',
'is_nav.in' => '是否作为导航错误',
];
}
static public function attr()
{
return [];
}
}
rules()方法中,=>左边的是被验证的字段,右边的是对左边的type做什么样的验证规则,每个规则用竖线“|”分隔。
'type' => 'required|in:1,2',
对type做验证,required规则代表type字段不能缺少,in:1,2规则代表type字段的值必须是1和2,不能是其它值,否则触发规则。
'name' => 'required|string|max:20',
对name字段做验证,name必填,必须是字符串,字符串的长度最大是20。
'dir_name' => 'required|alpha|max:20',
对dir_name做验证,dir_name必填,alpha规则要求必须全部是字母,字符串长度最大是20。
'pic' => 'string|max:50',
对pic做验证,pic可以为空,但是如果不为空时,pic必须是字符串切长度最大是50。
'is_nav' => 'required|in:0,1',
对is_nav做验证,is_nav必传,且值必须是0和1。
msg()方法中,是对触发规则后应该提示什么信息做的定义。
'type.required' => '类型不能为空',
该行代码说明,如果前端没有提交type字段或者type字段的值是空,则提示‘类型不能为空’
'type.in' => '类型错误',
该行代码说明,如果前端提交的数据不是1或者2,那么提示类型错误
'name.max' => '分类名称不能超过20个字符',
该行代码说明,如果前端提交的name值的长度超过20个,那么提示‘分类名称不能超过20个字符’
其它的不再解释了,道理一样。我们用postman测试下看看。
触发了规则,控制器中的代码不会往下执行,除非提交的数据完全符合规则。但是前边我们也说了,服务器端返回的接口类型是有固定规则的,这个接口返回的json格式不符合规则,所以,我们要处理下,处理成,当触发规则后,提示我们要求的json格式数据。我们要改点东西了。
打开/app/Exceptions/Handler.php文件,在render()方法中,加入代码
public function render($request, Exception $exception)
{
$response = new Response();
//数据验证异常拦截
$classException = get_class($exception);
if ($classException == ValidationException::class) {
// 返回所有错误信息
if ($exception instanceof \Illuminate\Validation\ValidationException) {
$response->setMsg(422, array_values($exception->validator->errors()->toArray())[0][0]);
return $response->responseJSON();
}
}
return parent::render($request, $exception);
}
然后再通过postman请求接口看看
看起作用了,其它几个接口的验证也是一样的,验证规则,你们就看laravel的验证规则吧。