前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel5.2之Validator

Laravel5.2之Validator

作者头像
botkenni
发布2022-01-10 09:10:42
13.2K0
发布2022-01-10 09:10:42
举报
文章被收录于专栏:IT码农

引言:

Laravel提供了Validator模块,可解决表单提交验证等一些需求,并且可以在视图View中显示错误验证信息,交互还是很友好的。注明:作者水平有限,有错误或建议请指正,轻拍。

概述:

Laravel中在Controller.php文件中引用了trait为ValidatesRequests,这个trait源码在/Illuminate/Foundation/Validation/ValidatesRequests.php,源码文件中主要包含了两个共有方法:validate()和validateWithBag(),有时间可以浏览浏览。。

(一)、post表单提交,并在视图中显示验证错误信息

1、先在routes.php中写两个路由:
代码语言:javascript
复制
    Route::get('laravel/test/validator', 'PHPTestController@getValidator');
    Route::post('laravel/test/validator', 'PHPTestController@postValidator');

PHPTestController可由php artisan make:controller PHPTestController这个Laravel自带的artisan命令来创建。 在PHPTestController控制器中写上getValidator方法:

代码语言:javascript
复制
    public function getValidator(){
        return view('validator.validator');
    }
2、写表单视图页面

该方法直接返回一个表单提交页面,表单提交页面视图代码为,文件路径为resources/validator/validator.blade.php:

代码语言:javascript
复制
    <html>
        <head>
            <title>Laravel Validator Test</title>
            <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
        </head>
        <body>
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <form action="{{url('laravel/test/validator')}}" method="POST">
                            <legend style="text-align: center">表单提交</legend>
                            <legend style="text-align: center">Person</legend>
                            <label style="margin-left: 50%">Name</label>
                            <input type="text" name="name">
                            <label style="margin-left: 50%">Age</label>
                            <input type="text" name="age">
                            <button type="submit" class="btn btn-success">Submit</button>
                        </form>
                    </div>
                </div>
            </div>
    
            <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
            <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        </body>
    </html>

在浏览器中访问http://XXX/laravel/test/validator这个路由,其中XXX为你的host,可以是虚拟的host也可以是你的共有域名,则表单提交页面为:

3、写表单提交控制器

然后写上表单提交方法postValidator:

代码语言:javascript
复制
    public function postValidator(Request $request){
    // $tmp = $request->get('name');
    // return $tmp;
            $this->validate($request, [
                'name' => 'required',
                'age'  => 'required|integer',
            ]);
            dd('form post success!!!');
        }

填写表单,name="name"和age="age",点击提交按钮,没有打印"form post success!!!";填写name="name"和age="18",打印"form post success!!!",说明验证模块已经工作了,但页面没有显示验证错误信息。

4、写显示验证错误信息视图

在laravel中,laravel会在每次请求把errors变量刷到session中,和视图模板绑定,所以errors变量在视图模板中可用,官方文档原话:"So, it is important to note that an

代码语言:javascript
复制
    @if(count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{$error}}</li>
                @endforeach
            </ul>
        </div>
    @endif

可在</form>结束标签后加上上面的代码,$errors实际上是Illuminate\Support\MessageBag的实例对象,MessageBag类里比较好用的几个方法如all()/get()/first()/has()等等,现在重新提交表单:

在表单页面就会显示验证的错误信息!!!

5、定制显示错误信息

错误信息是由laravel默认的,如果自定义显示错误信息,如:

代码语言:javascript
复制
    public function postValidator(Request $request){
    // $tmp = $request->get('name');
    // return $tmp;
            $this->validate($request, [
                'person.*.name' => 'required',
                'person.*.age'  => 'required|integer',
            ], ['person.*.name.required' => 'Required!!!']);
            dd('form post success!!!');
    }

只需要在validate(*)方法中加上$message[]参数就行,如代码中['person.*.name.required' => 'Required'],简单方便。 如果针对对于多个页面的person.*.name都写同样的错误显示信息,可以在resources/lang/en/validation.php文件中做定制:

代码语言:javascript
复制
    'custom' => [
                'attribute-name' => [
                    'rule-name' => 'custom-message',
                ],
                'person.*.name' => [
                    'required' => 'Required!!!',
                ],
                'person.*.age' => [
                    'required' => 'Age must be required!!!',
                   // 'min' => 'Age must be over 18!!!',
                ],
            ],
注意:

如果显示$errors变量不存在等错误,这主要是在app/Http/Kernel.php文件中,把\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class,从web中加到全局中间件$middleware中,或者在你写路由的时候加上web中间件:

代码语言:javascript
复制
    Route::group(['middleware'=>'web'], function(){
        Route::get('laravel/test/validator','PHPTestController@getValidator');
        Route::post('laravel/test/validator', 'PHPTestController@postValidator');
    });

(二)、验证数组形式表单

有时候在写表单时,需要同时输入相类似的表单输入时,可以把这些input作为数组看待,laravel5.2也提供了数组形式的验证,可以利用一个小demo看下。

1、重写下表单提交页面

修改下validator.blade.php中代码:

代码语言:javascript
复制
    <legend style="text-align: center">表单提交</legend>
    <legend style="text-align: center">Person</legend>
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[1][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[1][age]">
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[2][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[2][age]">
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[3][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[3][age]">
    <button type="submit" class="btn btn-success">Submit</button>
2、重写下表单提交控制器

修改下postValidator(*)方法:

代码语言:javascript
复制
    public function postValidator(Request $request){
    // $tmp = $request->get('name');
    // return $tmp;
            $this->validate($request, [
                'person.*.name' => 'required',
                'person.*.age'  => 'required|integer',
            ]);
            dd('form post success!!!');
        }

不填写输入直接提交表单,错误信息显示:

或者

(三)、定制一个表单请求类,把验证规则从控制中抽取出来

有时候,把验证规则逻辑单独放在一个类里,使得控制器代码更加简约。laravel提供了php artisan make:request TestValidatorRequest命令来创建一个单独类存放验证规则,生成的TestValidatorRequest.php文件存放在app/Http/Requests文件夹下。该存储类主要有两个重要方法:authorize()和rules()

1、在TestValidatorRequest类里写验证规则

authorize()方法主要用来设置用户权限,返回false时会返回一个403并且控制器代码不能执行,如没有权限的用户不能提交表单。这里直接把该方法源代码改为return true。 rules()方法里主要写表单验证规则,在这里把控制器中postValidator()方法的规则抽取出来放在这里:

代码语言:javascript
复制
    return [
                'person.*.name'=>'required',
                'person.*.age'=>'required|integer'
            ];
2、重写控制器中postValidator(*)方法

直接把TestValidatorRequest依赖注入进postValidator(*),这样laravel会自动验证规则:

代码语言:javascript
复制
    public function postValidator(TestValidatorRequest $request){
        //业务逻辑
        
        dd('form post success!!!');
    }
One more thing...

一个好用的PHP调试函数:debug_backtrace(),在laravel任意一个文件如自己创建的PHPTestController控制器的postValidator()函数中加上一句:

代码语言:javascript
复制
    var_dump(debug_backtrace());die();

会打印程序执行流程,看不清楚显示网页源代码看看,效率小神器。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/10/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言:
  • 概述:
  • (一)、post表单提交,并在视图中显示验证错误信息
    • 1、先在routes.php中写两个路由:
      • 2、写表单视图页面
        • 3、写表单提交控制器
          • 4、写显示验证错误信息视图
            • 5、定制显示错误信息
              • 注意:
              • (二)、验证数组形式表单
                • 1、重写下表单提交页面
                  • 2、重写下表单提交控制器
                  • (三)、定制一个表单请求类,把验证规则从控制中抽取出来
                    • 1、在TestValidatorRequest类里写验证规则
                      • 2、重写控制器中postValidator(*)方法
                        • One more thing...
                        相关产品与服务
                        消息队列 TDMQ
                        消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档