• Laravel 5.5 FormRequest 自定义表单请求验证类


    1、把表单验证逻辑写在Controller中,这是最基础的方法,但是不好维护,如:

     1 namespace AppHttpControllersAdmin;
     2 
     3 use IlluminateHttpRequest;
     4 use AppHttpControllersController;
     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 AppHttpRequests;
    
    use IlluminateFoundationHttpFormRequest;
    
    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 AppHttpControllersAdmin;
     4 
     5 use IlluminateHttpRequest;
     6 use AppHttpControllersController;
     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 (AppHttpRequestsMemberRequest $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。如果你有别的方法或者想法可以在评论中和我交流。

  • 相关阅读:
    JavaScript实现常见排序算法
    执行环境与作用域
    几种常见的三列布局,中间自适应,两边定宽
    常见的两列布局
    CodeAtlas For Sublime Text
    增加调用路径查找
    增加调用被调用个数隐喻
    sublime 插件
    分析大工程
    Jmeter 分布式测试
  • 原文地址:https://www.cnblogs.com/hualingyun/p/9123198.html
Copyright © 2020-2023  润新知