如何优雅的使用 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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
PHP中的extract的作用分析
Apr 09 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
php编写的一个E-mail验证类
Mar 25 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
Jsonp劫持学习
Apr 01 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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命令行使用方法和命令行参数说明
2014/04/08 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
javascript中HTMLDOM操作详解
2014/12/11 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
python判断字符串是否包含子字符串的方法
2015/03/24 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python编程argparse入门浅析
2018/02/07 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
优秀安全员事迹材料
2014/05/11 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
保卫工作个人总结
2015/03/03 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
检讨书范文
2019/04/16 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang