如何优雅的使用 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 相关文章推荐
WHOIS类的修改版
Oct 09 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
php 如何获取数组第一个值
Aug 06 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
smarty获得当前url的方法分享
Feb 14 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
PHP二维数组排序简单实现方法
Feb 14 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
PHP执行普通shell命令流程解析
Aug 24 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/12/06 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
基于js中this和event 的区别(详解)
2017/10/24 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
python实现tail实时查看服务器日志示例
2019/12/24 Python
python requests.get带header
2020/05/05 Python
python 如何快速复制序列
2020/09/07 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
高一生物教学反思
2014/01/17 职场文书
《称象》教学反思
2014/04/25 职场文书
班级文化建设标语
2014/06/23 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
学习十八大宣传标语
2014/10/09 职场文书
离婚协议书范文2015
2015/01/26 职场文书
设置IIS Express并发数
2022/07/07 Servers