Laravel 5.5 FormRequest 自定义表单请求验证类
Posted 泽一年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()}}
这里是我总结的一些经验,使得rules()能够可复用且只新增一个Request。如果你有别的方法或者想法可以在评论中和我交流。
以上是关于Laravel 5.5 FormRequest 自定义表单请求验证类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 5.5 的 FormRequest 类中返回自定义响应?
自定义 Laravel FormRequest 自动验证方法
PHPUnit env中的Laravel自定义FormRequest