Laravel 5.5 FormRequest 自定义表单请求验证类
1、把表单验证逻辑写在Controller中,这是最基础的方法,但是不好维护,如:
1 namespace App\Http\Controllers\Admin; 2 3 use Illuminate\Http\Request; 4 use App\Http\Controllers\Controller; 5 6 class MemberController extends Controller 7 { 8 // 登录模块 9 public function login (Request $request){ 10 if($request->isMethod('POST')){ 11 $this->validate($request,[ 12 'username' => 'required|max:10', 13 'password' => 'required|between:6,20', 14 ],[ 15 'username.required' => '用户名必填', 16 'password.required' => '密码必填', 17 ]); 18 19 } 20 return view('admin.login'); 21 } 22 }
这样写的话,表单验证和业务逻辑挤在一起,我们的Controller中就会有太多的代码,而且重复的验证规则基本也是复制粘贴。
我们可以利用Form Request来封装表单验证代码,从而精简Controller中的代码逻辑,使其专注于业务。而独立出去的表单验证逻辑甚至可以复用到其它请求中。
2、首先我们打开dos命令,进入该项目根目录下,创建request验证类:
3、MemberRequest公用验证模块代码
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class MemberUserRequest extends FormRequest { // 公共部分 public $rules=[ 'username' => 'required|max:10|unique:la_member', 'password' => 'required|between:6,20|confirmed', ]; //这里我只写了部分字段,可以定义全部字段 protected $messages=[ 'username.required' => '用户名必填', 'username.max' => '用户名最多为10字符', 'username.unique' => '用户名已存在', 'email.required' => '邮箱必填', 'email.email' => '邮箱格式错误11', 'password.required' => '密码必填', 'password.between' => '密码长度为6-20位字符', 'password.confirmed' => '两次密码不一致', 'code.required' => '验证码不能为空', 'code.between' => '验证码输入错误' ]; public function authorize() //这个方法可以用来控制访问权限,例如禁止未付费用户访问 { return true; //默认是false,使用时改成true, } public function rules() { $rules=$this->rules; // \Request::getPathInfo()方法获取命名路由,用来区分不同页面 if(\Request::getPathInfo()=='/admin/reg_sub'){ //路由为/admin/reg_sub的特有验证部分 $rules['email']='required|email'; $rules['code']='required|between:4,4'; } return $rules; } public function messages(){ //返回自定义消息,不使用的话为默认提示 return $this->messages; } }
4、控制器代码
3 namespace App\Http\Controllers\Admin; 4 5 use Illuminate\Http\Request; 6 use App\Http\Controllers\Controller; 7 use Crypt; 8 use DB;10 11 12 class MemberController extends Controller 13 { 14 // 登录模块 15 public function login (){ 16 return view('admin.login'); 17 } 18 // 登录提交 19 public function login_sub (\App\Http\Requests\MemberRequest $request){ //引入验证控制器后它会自动验证,不需其他操作
20 $username = $request->input('username'); 21 $password = $request->input('password'); 22 $data=[ 23 'username' => $username, 24 'password' => Crypt::encrypt($password), 25 'login_time' => time(), 26 ]; 27 28 //查询数据库验证登陆代码 29 30 } 31 }
5、登陆视图模块
@extends('admin/public/pub') @section('content') <div id="myform"> <center><h3>新用户</h3></center> <form method="post" action="{{url('admin/login_sub')}}" id=""> {{csrf_field()}} <fieldset> <legend>用户登陆</legend> <div> <label for="Name">用户名</label> <input type="text" name="username" value="{{old('username')}}" class="input" id="Name" size="20" maxlength="30"/> <br> </div> <div> <label for="password">输入密码</label> <input type="password" name="password" value="{{old('password')}}" class="input" id="password" size="18" maxlength="15"/> </div> <div> </div> <div class="enter"> <input name="login" type="submit" class="buttom" value="登陆"/> <a href="{{url('admin/reg')}}">注册</a> </div> </fieldset> </form> <br> @if(count($errors)>0) @foreach($errors->all() as $error) {{$error}} @endforeach @endif </div> @endsection
在视图中提示消息代码
1 @if(count($errors)>0) 2 @foreach($errors->all() as $error) 3 {{$error}} 4 @endforeach 5 @endif
也可以单行提示
{{$errors->first()}}