如何优雅的使用 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桌面中心(三) 修改数据库
Mar 11 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
sae使用smarty模板的方法
Dec 17 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
php+ajax无刷新上传图片的实现方法
Dec 06 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php时区转换转换函数
2014/01/07 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
做网页的一些技巧
2007/02/01 Javascript
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
Python中运行并行任务技巧
2015/02/26 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
python 将md5转为16字节的方法
2018/05/29 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python程序变成软件的实操方法
2019/06/24 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
书香校园活动方案
2014/02/28 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python