资讯专栏INFORMATION COLUMN

自定义laravel表单请求验证类(FormRequest共用一个rules())

张迁 / 3470人阅读

摘要:我们可以利用来封装表单验证代码,从而精简中的代码逻辑,使其专注于业务。如果有更好的解决方法,欢迎留言。

我们可以利用Form Request来封装表单验证代码,从而精简Controller中的代码逻辑,使其专注于业务。而独立出去的表单验证逻辑可以复用到其它请求中,看过几篇文章,大多都是讲怎么创建Request,表面看起来是将逻辑与业务分离了,但是没有做到复用,一个业务就得新建一个Request类实在太累,索性这里我将项目全部的表单验证放在一个Request类里,实现高度可复用,下面是具体实现。

首先创建Request
php artisan make:request CreateUserRequest
CreateUserRequest代码块
 "required|between:2,4",
        "Student.userAge" => "required|integer",
        "Student.userSex" => "required|integer",
        "Student.addr" => "required",
    ];
    //这里我只写了部分字段,可以定义全部字段
    protected $strings_key = [
        "Student.userName" => "用户名",
        "Student.userAge" => "年龄",
        "Student.userSex" => "性别",
        "Student.addr" => "地址",
    ];
    //这里我只写了部分情况,可以按需定义
    protected $strings_val = [
        "required"=> "为必填项",
        "min"=> "最小为:min",
        "max"=> "最大为:max",
        "between"=> "长度在:min和:max之间",
        "integer"=> "必须为整数",
        "sometimes"=> "",
    ];

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;//修改为true
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {

        $rules = $this->rules;
        // 根据不同的情况, 添加不同的验证规则
        if (Request::getPathInfo() == "/save")//如果是save方法
        {
            $rules["Student.addr"] = "sometimes";
        }
        if (Request::getPathInfo() == "/edit")//如果是edit方法
        {
            $rules["Student.addr"] = "required|min:5";
        }
        return $rules;        

    }
  //返回给前台的错误信息
    public function messages(){
        $rules = $this->rules();
        $k_array = $this->strings_key;
        $v_array = $this->strings_val;
        foreach ($rules as $key => $value) {
            $new_arr = explode("|", $value);//分割成数组
            foreach ($new_arr as $k => $v) {
                $head = strstr($v,":",true);//截取:之前的字符串
                if ($head) {$v = $head;}
                $array[$key.".".$v] = $k_array[$key].$v_array[$v];                  
            }
        }
        return $array;
    }
}
控制器具体方法
    /**
     * Show the form for creating a new resource.
     *
     * @return IlluminateHttpResponse
     */
    public function save(AppHttpRequestsCreateUserRequest $request)
    {
            //这里会自动调用表单验证
            //验证成功后继续向下执行
            $data = $request->input("Student");
            if(User::create($data)){
               return redirect("/")->with("success", "添加成功!");
            }else{
               return redirect("/create")->with("error", "添加失败!"); 
            }
    }
对应的模板文件
{!! csrf_field() !!}

{{ $errors->first("Student.userName") }}

{{$errors->first("Student.userAge")}}

{{$errors->first("Student.addr")}}

![QQ截图20170613152555.png](http://upload-images.jianshu.io/upload_images/2825702-f008b65789a425f4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

{{ $errors->first("Student.userSex") }}

效果展示


写在最后
通过文本可以看到, Form Requests 对于简化表单请求的数据校验是非常强大和方便的.这里我做了一些修改,使得rules()能够可复用且只新增一个Request。如果有更好的解决方法,欢迎留言。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25877.html

相关文章

  • Laravel 5.7 最佳实践和开发技巧分享

    摘要:当查询数据时,本地范围允许我们创建自己的查询构造器链式方法。这样便会知道这是一个本地范围并且可以在查询构造器中使用。某些查询构造器不可用或者说可用但是方法名不同,关于这些请查阅所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可编写出干净,可用可调试的...

    ninefive 评论0 收藏0
  • Laravel 从入口到输出过程详解

    摘要:预备知识目录后面简称目录后面简称入口文件过程详解范例定义路由文件路径修改如下定义中间件中间件路径新建中间件必须返回响应在处理请求之前做些什么在处理请求之后做些什么中间件处理完毕后,做些什么中间件处理完毕后,做些什么注册中间件中间件配件文件路 I. 预备知识 Laravel 目录 /path/to 后面简称 Laravel Web 目录 Laravel/public 后面简称 Web 入...

    Harriet666 评论0 收藏0
  • Laravel思维导图之HTTP请求、响应、表单验证

    摘要:今天我来分享中层关于请求响应与表单验证的知识。手动创建验证请求之前的内容是直接使用的方法来实现表单验证。下一步到这篇为止,我完成了入门指南核心概念层的路由中间件控制器请求响应表单验证的学习和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我来分享 Laravel 中 HTTP 层关于请求、响应与表...

    lewif 评论0 收藏0
  • Laravel 5.4 入门系列 12. 使用请求进行字段验证

    摘要:本节内容比较简单,之前我们使用方法来进行字段验证,这样做有一个不好的地方就是,如果你要在很多地方使用同样的验证,就需要重复编写代码。因此,提供另外一种方式来进行字段验证,即请求类。 本节内容比较简单,之前我们使用 validator 方法来进行字段验证,这样做有一个不好的地方就是,如果你要在很多地方使用同样的验证,就需要重复编写代码。因此,Laravel 提供另外一种方式来进行字段验证...

    BearyChat 评论0 收藏0
  • Laravel 5系列教程七:表单验证 Validation

    摘要:几乎在每一个应用当中都会有表单,而有表单基本就离不开表单验证。在中,其实可以说是有两种方式来进行表单验证使用和使用。然后,上面的验证规则是对于和两个字段,我们需要用户为其填充内容,不能为空。 原文来自:https://laravist.com/article/15 免费视频教程地址 https://laravist.com/series/laravel-5-basic Laravis...

    jindong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<