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 ...
随机推荐
- 【YashanDB知识库】oracle dblink varchar类型查询报错记录
问题单:Oracle DBLINK查询崖山DB报错 oracle服务器上ODBC安装 unixodbc安装:yum -y install unixODBC mysql 配置安装对应版本的odbc: m ...
- 如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群
如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群. 打开GitHub搜索redis,边可以看到,该项目的介绍是这样的: Redis is an in-memory datab ...
- 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现
高并发场景:秒杀商品. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:1000个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功. 示例 ...
- 为什么C++ 单例局部static初始化是线程安全的?
为什么C++ 单例局部static初始化是线程安全的? const bg::AppSettings& bg::AppSettings::GetInstance() { static AppSe ...
- ASP.NET Core Library – MailKit SMTP Client
前言 以前写的 SMTP Client 相关文章: Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 ) ASP.NET Email ...
- 字节跳动的多平台绽放秘诀 | Flutter 开发者故事
字节跳动旗下运营着一系列成功的用户产品.企业应用以及服务,覆盖信息.教育.娱乐等不同领域.随着产品阵容的不断发展,传统的原生双平台开发已经难以满足团队更高效.更灵活.更精美,以及更多样的产品研发需求. ...
- [OI] 欢夏!邪龙?马拉车!
标题来自原神 算法概述 Manacher 算法 用途:寻找回文串,最板子的情况下用于字符串的回文子串计数 给定一个字符串 \(S\),求出它全部的回文子串 容易想到一种暴力的 \(n^{2}\) 做法 ...
- string的find()与npos
在 C++ 中,std::string::find() 是一个用于在字符串中查找子字符串或字符的成员函数.查找成功时返回匹配的索引位置,查找失败时返回 std::string::npos,表示未找到. ...
- 4.3.2 等比数列的前n项和公式
\({\color{Red}{欢迎到学科网下载资料学习 }}\) [ [基础过关系列]高二数学同步精品讲义与分层练习(人教A版2019)] ( https://www.zxxk.com/docpack ...
- Teradata退出中国,您可以相信中国数据库!
继Adobe.Tableau.Salesforce之后,2023年2月15日,数仓软件巨头Teradata宣布将逐步结束在中国的直接运营.数仓界的"黄埔军校"仓皇撤出中国市场给出的 ...