如何优雅的使用 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语法(2)
Oct 09 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
php银联网页支付实现方法
Mar 04 PHP
微信公众平台开发之配置与请求
Aug 26 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
php如何实现只替换一次或N次
Oct 29 PHP
PHP的运行机制与原理(底层)
Nov 16 PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 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设计聊天室步步通
2006/10/09 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
33道php常见面试题及答案
2015/07/06 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
js获取变量
2006/08/24 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
浅析JavaScript动画
2015/06/10 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
django+mysql的使用示例
2018/11/23 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
详解如何修改python中字典的键和值
2020/09/29 Python
Linux面试题LINUX系统类
2015/11/25 面试题
英文商务邀请信
2014/01/22 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
护士业务学习心得体会
2016/01/25 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server