Laravel 6.2 表单验证之表单请求验证
Laravel表单验证的方式之一,可通过单独的规则文件来验证请求中的参数,对不符合规则的情况下,自动跳转至表单页面并携带错误提示信息,可以达到参数验证与数据入库等业务分层处理。
创建表单验证文件
命令:
php artisan make:request ScoreGoodsRequest
在http下会新增一个Requests文件夹和表单请求验证文件
开启请求验证
默认是false,改为true。也可以在此处理对用户是否进行验证的权限判断
public function authorize()
{
return true;
}
自定义验证规则
设置验证规则。验证规则可通过查看官方文档《可用验证规则》
/**
* 设置验证规则
* 此处应用了验证场景【新增、编辑】
* @return array
*/
public function rules()
{
// 新增使用POST提交
if(request()->method() == 'POST')
{
return [
'name' => 'required|unique:score_goods',
'desc' => 'required',
'price' => 'required|regex:/^\d{1,8}$/',
'score' => 'required|regex:/^\d{1,8}$/',
'sort' => 'required|regex:/^\d{1,4}$/',
];
} else {
// 编辑使用PATCH提交
return [
'name' => 'required',
'desc' => 'required',
'price' => 'required|regex:/^\d{1,8}$/',
'score' => 'required|regex:/^\d{1,8}$/',
'sort' => 'required|regex:/^\d{1,4}$/'
];
}
}
自定义错误提示
可以通过重写表单请求的 messages 方法来自定义错误消息。
/**
* 自定义错误提示
* @return array
*/
public function messages()
{
return [
'name.required' => '请输入商品名称!',
'name.unique' => '商品已存在,不可重复添加!',
'desc.required' => '请输入商品描述!',
'price.required' => '请输入商品价格!',
'price.regex' => '商品单价为数字,应大于1!',
'score.required' => '请输入兑换积分!',
'score.regex' => '商品兑换积分为数字,应大于1!',
'sort.required' => '请输入商品排序!',
'sort.regex' => '商品排序为数字,应大于1!',
];
}
控制器调用
/**
* 新增商品保存
* @param ScoreGoodsRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(ScoreGoodsRequest $request)
{
$return = $this->exchangeService->addGoods($request->all());
return redirect()->route('goods.create');
}
处理错误信息
如果传入的请求参数未通过给定的验证规则,Laravel 会自动把用户重定向到之前的位置。另外,所有的验证错误信息会被自动存储到 session。
不用在 GET 路由中将错误消息显式绑定到视图。Lavarel 会检查在 Session 数据中的错误信息,并自动将其绑定到视图。而其中的变量 $errors 是 Illuminate\Support\MessageBag 的一个实例。
当验证失败的时候,用户将会被重定向到控制器的 create/edit 方法,使我们能在视图中通过$error显示错误信息:
<!-- /resources/views/goods/create.blade.php -->
<form class="form-horizontal m-t-md" action="{{ route('goods.store') }}" method="post" accept-charset="UTF-8" enctype="multipart/form-data">
{!! csrf_field() !!}
<div class="form-group">
<label class="col-sm-2 control-label">商品名称:</label>
<div class="input-group col-sm-4">
<input type="text" class="form-control" name="name" value="{{old('name') ?? ''}}" required>
@if ($errors->has('name'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('name')}}</span>
@endif
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">商品描述:</label>
<div class="input-group col-sm-4">
<input type="text" class="form-control" name="desc" value="{{old('desc') ?? ''}}" required>
@if ($errors->has('desc'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('desc')}}</span>
@endif
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">商品单价:</label>
<div class="input-group col-sm-4">
<input type="text" class="form-control" name="price" value="{{old('price') ?? ''}}" required>
@if ($errors->has('price'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('price')}}</span>
@endif
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">兑换积分:</label>
<div class="input-group col-sm-4">
<input type="number" class="form-control" name="score" value="{{old('score') ?? ''}}" required>
@if ($errors->has('score'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('score')}}</span>
@endif
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">商品备注:</label>
<div class="input-group col-sm-4">
<input type="text" class="form-control" name="remark" value="{{old('remark') ?? ''}}">
@if ($errors->has('remark'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('remark')}}</span>
@endif
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">商品排序:</label>
<div class="input-group col-sm-4">
<input type="number" class="form-control" name="sort" value="{{old('sort') ?? 0}}" required>
@if ($errors->has('sort'))
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i>{{$errors->first('sort')}}</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-sm-5 text-center">
<button class="btn btn-primary" type="submit"><i class="fa fa-check"></i> 保 存</button>
<button class="btn btn-white" type="reset"><i class="fa fa-repeat"></i> 重 置</button>
</div>
</div>
<div class="clearfix"></div>
</form>
<!-- Create Post Form -->
实现效果