如何优雅的使用 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连接Oracle for NT 远程数据库
Oct 09 PHP
一些PHP写的小东西
Dec 06 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
PHP异常处理Exception类
Dec 11 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
php正则修正符用法实例详解
Dec 29 PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 PHP
PHP内置函数生成随机数实例
Jan 18 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反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
打包发布Python模块的方法详解
2016/09/18 Python
python模块之time模块(实例讲解)
2017/09/13 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
python使用配置文件过程详解
2019/12/28 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
运动会通讯稿100字
2014/01/31 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
志愿者活动总结范文
2014/04/26 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
贷款收入证明格式
2015/06/24 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
Python数组变形的几种实现方法
2022/05/30 Python