如何优雅的使用 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字符串处理的10个简单方法
Jun 30 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php实现随机生成易于记忆的密码
Jun 19 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
phpstudy的php版本自由修改的方法
Oct 18 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 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
joomla内置的表单验证功能使用方法
2010/06/11 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
Java中final关键字详解
2015/08/10 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
angularjs下拉框空白的解决办法
2017/06/20 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
python:print格式化输出到文件的实例
2018/05/14 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
python excel多行合并的方法
2020/12/09 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
合作协议书范本
2014/10/25 职场文书
档案接收函格式
2015/01/30 职场文书
会计主管岗位职责
2015/04/02 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL