如何优雅的使用 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 相关文章推荐
关于PHP5 Session生命周期介绍
Mar 02 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
php微信公众号开发之秒杀
Oct 20 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
php利用ZipArchive类操作文件的实例
Jan 21 PHP
如何使用php生成zip压缩包
Apr 21 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
Syphon 秘笈
2021/03/03 冲泡冲煮
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
JavaScript如何操作css
2020/10/24 Javascript
Python struct模块解析
2014/06/12 Python
Python实现ping指定IP的示例
2018/06/04 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
夜不归宿检讨书
2014/02/25 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2014年文艺部工作总结
2014/11/17 职场文书