如何优雅的使用 laravel 的 validator验证方法


Posted in PHP onNovember 11, 2018

web 开发过程中经常会需要进行参数验证,laravel 中我们常用 validator 或者 request 这两种方法来进行验证,但是这两种验证都不是很方便进行自定义提示信息,自定义验证规则,所以下面来介绍一种很方便的用法:

新建抽象类

<?php

namespace App\Http\Validators;

use Validator;

abstract class AbstractValidator
{

 /**
  * Validator
  *
  * @var \Illuminate\Validation\Factory
  */
 protected $validator;

 /**
  * Validation data key => value array
  *
  * @var array
  */
 protected $data = array();

 /**
  * Validation errors
  *
  * @var array
  */
 protected $errors = array();

 /**
  * Validation rules
  *
  * @var array
  */
 protected $rules = array();

 /**
  * Validation messages
  *
  * @var array
  */
 protected $messages = array();

 /**
  * Validation codes
  *
  * @var array
  */
 protected $codes = array();

 public function __construct(array $data)
 {
  $this->data = $data;
  $this->before();
  $this->validator = Validator::make($this->data, $this->rules, $this->messages);
  $this->after();
 }

 /**
  * Set data to validate
  *
  * @return validator
  */
 public function getValidator()
 {
  return $this->validator;
 }

 /**
  * Set data to validate
  *
  * @return $this
  */
 public function with(array $data)
 {
  $this->data = $data;
  $this->before();
  $this->validator = $this->validator->make($this->data, $this->rules, $this->messages);
  $this->after();
  return $this;
 }

 /**
  * Validation passes or fails
  *
  * @return boolean
  */
 public function passes()
 {
  if ($this->validator->fails()) {
   $this->errors = $this->validator->messages();

   return false;
  }

  return true;
 }

 /**
  * Return errors, if any
  *
  * @return array
  */
 public function errors()
 {
  return $this->errors;
 }

 /**
  * Return errors codes, if any
  *
  * @return array
  */
 public function getCodes()
 {
  return $this->codes;
 }

 /**
  * getRules
  *
  * @return array
  */
 public function getRules()
 {
  return $this->rules;
 }

 /**
  * getData
  *
  * @return array
  */
 public function getData()
 {
  return $this->data;
 }

 /**
  * getErrors
  *
  * @return array
  */
 public function getErrors()
 {
  return $this->errors;
 }

 /**
  * getMessages
  *
  * @return array
  */
 public function getMessages()
 {
  return $this->messages;
 }

 /**
  * setRule
  *
  * @param string $key
  * @param string $value
  *
  * @return $this
  */
 public function setRule($key, $value)
 {
  $this->rules[$key] = $value;

  return $this;
 }

 /**
  * emptyRules
  *
  * @return $this
  */
 public function emptyRules()
 {
  $this->rules = array();

  return $this;
 }

 /**
  * sometimes
  *
  * @param string  $attribute
  * @param string|array $rules
  * @param callable  $callback
  *
  * @return $this
  */
 public function sometimes($attribute, $rules, callable $callback)
 {
  $this->validator->sometimes($attribute, $rules, $callback);

  return $this;
 }

 /**
  * resolver
  *
  * @param Closure $resolver
  *
  * @return $this
  */
 public function resolver(Closure $resolver)
 {
  Validator::resolver($resolver);

  return $this;
 }

 /**
  * replacer
  *
  * @param Closure $resolver
  *
  * @return $this
  */
 public function replacer($replace, Closure $resolver)
 {
  Validator::replacer($replace, $resolver);

  return $this;
 }

 /**
  * extendImplicit
  *
  * @param Closure $resolver
  *
  * @return $this
  */
 public function extendImplicit($extendImplicit, Closure $resolver)
 {
  Validator::extendImplicit($extendImplicit, $resolver);

  return $this;
 }

 /**
  * extend
  *
  * @param string   $rule
  * @param \Closure|string $extension
  * @param string   $message
  *
  * @return $this
  */
 public function extend($rule, $extension, $message = null)
 {
  Validator::extend($rule, $extension, $message);

  return $this;
 }

 /**
  * before (extend(),resolver())
  *
  * @return $this
  */
 public function before()
 {
 }

 /**
  * after(sometimes())
  *
  * @return $this
  */
 public function after()
 {
 }
}

新建中间件

<?php

namespace App\Http\Middleware;

use Closure;
use \Illuminate\Http\Request;

class ValidateAdminMiddleware
{
 /**
  * This namespace is applied to the controller routes in your routes file.
  *
  * In addition, it is set as the URL generator's root namespace.
  *
  * @var string
  */
 protected $namespace = 'App\Http\Validators';

 /**
  * Handle an incoming request.
  *
  * @param \Illuminate\Http\Request $request
  * @param \Closure     $next
  *
  * @return mixed
  */
 public function handle(Request $request, Closure $next, $validator = null)
 {
  if ($request->isMethod('POST')) {
   $type = $request->segment(1);
   if ($validator) {
    $validator = $this->namespace . '\\' . studly_case($type) . '\\' . studly_case($validator) . 'Validator';
    $validator = new $validator($request->all());

    if (!$validator->passes()) {
     if ($request->isAjax()) {
      return $validator->errors()->first();
     } else {
      return redirect()->back()
      ->withErrors($validator->getValidator())
      ->withInput();
     }
    }
   }
  }
  return $next($request);
 }
}

新建 TestTestValidator

<?php

namespace App\Http\Validators\Admin;

use App\Http\Validators\AbstractValidator;

class TestValidator extends AbstractValidator
{
 /**
  * Validation rules
  *
  * @var Array
  */
 protected $rules = array(
  'name' => ['required', 'test', 'min:1'],
 );

 /**
  * Validation messages
  *
  * @var Array
  */
 protected $messages = array(
  'name.required' => '必填',
  'name.min' => '最少1个字符',
  'name.test' => '测试',
 );

 /**
  * 自定义验证规则或者扩展Validator类
  */
 public function before()
 {
  $this->extend('test', function ($attribute, $value, $parameters) {
   return bool;
  });
 }
}

路由中如何使用

Route::post('/', ['middleware' => ['valiAdmin:Test'], 'uses' => 'IndexController@test']);

具体使用可以自行配置~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP实现多图片上传类实例
Jul 26 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 #PHP
safari下载文件自动加了html后缀问题
Nov 09 #PHP
centos7上编译安装php7以php-fpm方式连接apache
Nov 08 #PHP
PHP校验15位和18位身份证号的类封装
Nov 07 #PHP
php中如何执行linux命令详解
Nov 06 #PHP
laravel中的一些简单实用功能
Nov 03 #PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 #PHP
You might like
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
JQuery 弹出框定位实现方法
2010/12/02 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
Python常用模块介绍
2014/11/21 Python
python查看微信好友是否删除自己
2016/12/19 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
生日邀请函范文
2014/01/13 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
甘南现象心得体会
2014/09/11 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
JS实现扫雷项目总结
2021/05/19 Javascript
Python基础之元编程知识总结
2021/05/23 Python
我去timi了,一起去timi是什么意思?
2022/04/13 杂记