laravel之验证器
开发中使用框架自带验证器进行参数验证
1.定义验证器基类,定义失败返回值
新建基础类文件 app > Http > Requests > BaseRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException; class BaseRequest extends FormRequest
{
protected function failedValidation(Validator $validator) {
$error= $validator->errors()->all();
throw new HttpResponseException(response()->json(['msg'=>'error','code'=>'500','data'=>$error[0]], 500));
}
}
?>
这里验证器继承BaseRequest.php
2.多场景验证
1)封装验证基类BaseValidate.php, 放置在app\Validate下, 其他地方也是OK的
<?php
namespace App\Validate; use Illuminate\Support\Facades\Validator;
/**
* 扩展验证器
*/
class BaseValidate { /**
* 当前验证规则
* @var array
*/
protected $rule = []; /**
* 验证提示信息
* @var array
*/
protected $message = []; /**
* 验证场景定义
* @var array
*/
protected $scene = []; /**
* 设置当前验证场景
* @var array
*/
protected $currentScene = null; /**
* 验证失败错误信息
* @var array
*/
protected $error = []; /**
* 场景需要验证的规则
* @var array
*/
protected $only = []; /**
* 设置验证场景
* @access public
* @param string $name 场景名
* @return $this
*/
public function scene($name)
{
// 设置当前场景
$this->currentScene = $name; return $this;
} /**
* 数据验证
* @access public
* @param array $data 数据
* @param mixed $rules 验证规则
* @param array $message 自定义验证信息
* @param string $scene 验证场景
* @return bool
*/
public function check($data, $rules = [], $message = [],$scene = '')
{
$this->error =[];
if (empty($rules)) {
//读取验证规则
$rules = $this->rule;
}
if (empty($message)) {
$message = $this->message;
} //读取场景
if (!$this->getScene($scene)) {
return false;
} //如果场景需要验证的规则不为空
if (!empty($this->only)) {
$new_rules = [];
foreach ($this->only as $key => $value) {
if (array_key_exists($value,$rules)) {
$new_rules[$value] = $rules[$value];
}
}
$rules = $new_rules;
}
// var_dump($rules);die;
$validator = Validator::make($data,$rules,$message);
//验证失败
if ($validator->fails()) {
$this->error = $validator->errors()->first();
return false;
} return !empty($this->error) ? false : true;
} /**
* 获取数据验证的场景
* @access protected
* @param string $scene 验证场景
* @return void
*/
protected function getScene($scene = '')
{
if (empty($scene)) {
// 读取指定场景
$scene = $this->currentScene;
}
$this->only = []; if (empty($scene)) {
return true;
} if (!isset($this->scene[$scene])) {
//指定场景未找到写入error
$this->error = "scene:".$scene.'is not found';
return false;
}
// 如果设置了验证适用场景
$scene = $this->scene[$scene];
if (is_string($scene)) {
$scene = explode(',', $scene);
}
//将场景需要验证的字段填充入only
$this->only = $scene;
return true;
} // 获取错误信息
public function getError()
{
return $this->error;
} }
2)使用 ArticleValidate.php
<?php
namespace App\Validate; use App\Validate\BaseValidate;
/**
* 文章验证器
*/
class ArticleValidate extends BaseValidate {
//验证规则
protected $rule =[
'id'=>'required',
'title' => 'required|max:255',
'content' => 'required',
];
//自定义验证信息
protected $message = [
'id.required'=>'缺少文章id',
'title.required'=>'请输入title',
'title.max'=>'title长度不能大于 255',
'content.required'=>'请输入内容',
]; //自定义场景
protected $scene = [
'add'=>"title,content",
'edit'=> ['id','title','content'],
];
}
rule: 定义规则
message: 定义验证信息
scene: 验证场景
3) 非场景验证方式
public function update(){
$ArticleValidate = new ArticleValidate;
$request_data = [
'id'=>'1',
'title'=>'我是文章的标题',
'content'=>'我是文章的内容',
];
if (!$ArticleValidate->check($request_data)) {
var_dump($ArticleValidate->getError());
}
}
check 方法中总共有四个参数,第一个要验证的数据,第二个验证规则,第三个自定义错误信息,第四个验证场景,其中 2,3,4 非必传。
如果验证未通过我们调用 getError() 方法来输出错误信息,getError()暂不支持返回所有验证错误信息 。
4)控制器中使用
public function add(){
$ArticleValidate = new ArticleValidate;
$request_data = [
'title'=>'我是文章的标题',
'content'=>'我是文章的内容',
];
if (!$ArticleValidate->scene('add')->check($request_data)) {
var_dump($ArticleValidate->getError());
}
}
5)控制器内验证
public function add(){
$Validate = new BaseValidate;
$request_data = [
'title'=>'我是文章的标题',
'content'=>'我是文章的内容',
];
$rule =[
'id'=>'required',
'title' => 'required|max:255',
'content' => 'required',
];
//自定义验证信息
$message = [
'id.required'=>'缺少文章id',
'title.required'=>'请输入title',
'title.max'=>'title长度不能大于 255',
'content.required'=>'请输入内容',
];
if (!$Validate->check($request_data,$rule,$message)) {
var_dump($Validate->getError());
}
}
通过验证场景,既减少了控制器代码的臃肿,又减少了 FormRequest 文件过多,还可以自定义 json 数据
laravel之验证器的更多相关文章
- 关于脱离laravel框架使用Illuminate/Validation验证器
1.关于Illuminate/Validation验证器 Validation 类用于验证数据以及获取错误消息. github地址:github.com/illuminate/validation 文 ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- linux上使用google身份验证器(简版)
系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...
- vue-validator(vue验证器)
官方文档:http://vuejs.github.io/vue-validator/zh-cn/index.html github项目地址:https://github.com/vuejs/vue-v ...
- 原生JS 表单提交验证器
转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...
- yii框架中验证器声明一组内置验证器可以使用短名称引用
1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...
- 通过Google身份验证器加强Linux帐户安全
下载Google的身份验证模块: # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...
- 谷歌身份验证器加强Linux帐户安全
下载 Google的身份验证模块 # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...
- JFinal极速开发实战-业务功能开发-通用表单验证器
提交表单数据时,需要经过前端的验证才能提交到后台,而后台的验证器再做一道数据的校验,成功之后才能进入action进行业务数据的处理. 在表单数据的验证中,数据类型的验证还是比较固定的.首先是对录入数据 ...
- yii 验证器和验证码
http://www.yiiframework.com/doc/api/1.1/CCaptcha http://www.cnblogs.com/analyzer/articles/1673015.ht ...
随机推荐
- Authentication vs. Authorization
Authentication vs. Authorization So, what is the difference between authentication and authorization ...
- 解决向github上push报 error: failed to push some refs to 'xxxxx' 问题
解决向github上push报 error: failed to push some refs to 'xxxxx' 问题 1.问题 向github上push 代码时,报 error: failed ...
- Go实现实时文件监控功能
一.使用库介绍 fsnotify 是 Go 语言中的一个库,用于监听文件系统的变更事件.它允许程序注册对文件系统事件的兴趣,并在这些事件发生时接收通知.fsnotify 主要用来监控目录下的文件变化, ...
- JavaScript – 类型转换
介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...
- JAVAEE——maven安装
一.安装本地Maven 注意:检查JAVA_HOME环境变量, maven本身就是java写的,所以要求必须先安装JDK,检查本机jak环境win+r后输入cmd,然后输入java -version, ...
- [R18][中国語翻訳]HDKのABC370赛試(ABC370)
A.Raise Both Hands \(\texttt{Diff }11\) #include<bits/stdc++.h> using namespace std; #define e ...
- USB协议详解第6讲(USB描述符-端点描述符)
1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符.字符串描述符,HID设备有HID描述符.报告描述符和物理描述符.今天主要是学习USB端点描述符的组成. 2.端点描述 ...
- Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
APP启动方式 App启动方式分三种:冷启动(cold start).热启动(hot start).温启动(warm start) ▲ 冷启动 系统不存在App进程(APP首次启动或APP被完全杀死) ...
- js 时间日期
Date.parse() 把字符串时间转化为时间戳. new Date(时间戳) 转化 时间格式 时间比较大小
- vue 的响应式原理
首先,遍历data的数据,通过 Obejct.defineProperty 定义数据,给数据加上 geter 和 setter 函数,获取数据触发 getter函数, 修改数据时触发 setter函数 ...