php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AddCartRequest extends FormRequest

{

public function authorize()

{

return true;

}

//这两种写法都是支持的

public function rules(){

return [

'amount' => ['required', 'integer', 'min:1'],

'pid' => 'required|integer',

];

}

//如果没有编写message 提示信息,

//这里的attributes 默认会把 amout 这个字段替换成  商品数量

//前提是 这条数据没有经过验证

public function attributes()

{

return [

'amount' => '商品数量'

];

}

public function messages()

{

return [

'sku_id.required' => '请选择商品'

];

}

}

使用命令行创建验证器G:\phpstudy\WWW\laravel_base>php artisan make:request UserRequest created successfully.

带有回调函数的验证,有了这条就能做很多的验证了,举例说明,你可以想想看public function rules()

{

return [

'sku_id' => [

'required',

function ($attribute, $value, $fail) {

if (!$sku = ProductSku::find($value)) {

return $fail('该商品不存在');

}

if (!$sku->product->on_sale) {

return $fail('该商品未上架');

}

if ($sku->stock === 0) {

return $fail('该商品已售完');

}

if ($this->input('amount') > 0 && $sku->stock input('amount')) {

return $fail('该商品库存不足');

}

},

],

'amount' => ['required', 'integer', 'min:1'],

];

}

举例说明一个简单的验证:、public function rules()

{

return [

'reason' => 'required',

// 判断用户提交的地址 ID 是否存在于数据库并且属于当前用户

'address_id'     => [

'required',

Rule::exists('user_addresses', 'id')->where('user_id', $this->user()->id),

],

];

}

public function attributes()

{

return [

'reason' => '原因',

];

}

使用回调函数,对数组中的数据进行验证<?php

namespace App\Http\Requests;

use Illuminate\Validation\Rule;

use App\Models\ProductSku;

class OrderRequest extends Request

{

public function rules()

{

return [

// 判断用户提交的地址 ID 是否存在于数据库并且属于当前用户

// 后面这个条件非常重要,否则恶意用户可以用不同的地址 ID 不断提交订单来遍历出平台所有用户的收货地址

'address_id'     => [

'required',

Rule::exists('user_addresses', 'id')->where('user_id', $this->user()->id),

],

'items'          => ['required', 'array'],

'items.*.sku_id' => [ // 检查 items 数组下每一个子数组的 sku_id 参数

'required',

function ($attribute, $value, $fail) {

if (!$sku = ProductSku::find($value)) {

return $fail('该商品不存在');

}

if (!$sku->product->on_sale) {

return $fail('该商品未上架');

}

if ($sku->stock === 0) {

return $fail('该商品已售完');

}

// 获取当前索引

preg_match('/items\.(\d+)\.sku_id/', $attribute, $m);

$index = $m[1];

// 根据索引找到用户所提交的购买数量

$amount = $this->input('items')[$index]['amount'];

if ($amount > 0 && $amount > $sku->stock) {

return $fail('该商品库存不足');

}

},

],

'items.*.amount' => ['required', 'integer', 'min:1'],

];

}

}

required条件判断public function rules()

{

return [

'agree'  => ['required', 'boolean'],

'reason' => ['required_if:agree,false'], // 拒绝退款时需要输入拒绝理由

];

}

带有attributes的验证namespace App\Http\Requests;

class UserAddressRequest extends Request

{

public function rules()

{

return [

'province'      => 'required',

'city'          => 'required',

'district'      => 'required',

'address'       => 'required',

'zip'           => 'required',

'contact_name'  => 'required',

'contact_phone' => 'required',

];

}

public function attributes()

{

return [

'province'      => '省',

'city'          => '城市',

'district'      => '地区',

'address'       => '详细地址',

'zip'           => '邮编',

'contact_name'  => '姓名',

'contact_phone' => '电话',

];

}

}

第一个方法:authorize(),控制用户访问权限

表单请求授权验证

表单请求类内也包含了 authorize 方法。在这个方法中,你可以检查经过身份验证的用户确定其是否具有更新给定资源的权限。比方说,你可以判断用户是否拥有更新文章评论的权限:

/**

* 判断用户是否有权限做出此请求。

*

* @return bool

*/

public function authorize()

{

$comment = Comment::find($this->route('comment'));

return $comment && $this->user()->can('update', $comment);

}

由于所有的表单请求都是继承了 Laravel 中的请求基类,所以我们可以使用 user 方法去获取当前认证登录的用户。同时请注意上述例子中对 route 方法的调用。这个方法允许你在被调用的路由上获取其定义的 URI 参数,譬如下面例子中的 {comment} 参数:

如果 authorize 方法返回 false,则会自动返回一个包含 403 状态码的 HTTP 响应,也不会运行控制器的方法。

如果你打算在应用程序的其它部分处理授权逻辑,只需从 authorize 方法返回 true:

/**

* 判断用户是否有权限进行此请求。

*

* @return bool

*/

public function authorize()

{

return true;

}

第二个方法:$rules(),返回验证的数组

第三个方法:$message(),返回自定义的错误信息

原来控制器写法:

传统上我们这样使用,但是造成每个controller都需要对这些参数单独判断.代码复用率不高.

public function navSet(Request $request)

{

$validator = Validator::make($request->all(), [

'h5_id' => 'required |int',

'font_color'=>'string|nullable',

'select_color'=>'string|nullable',

'background_color'=>'string|nullable',

'position'=>'int|required| between:0,1'

]);

if ($validator->fails()) {

return $this->output(null,'参数有误,请重试!',500);

}

$request_params=$request->all();

//接下来实现你的业务逻辑....

}

当我们抽离出来参数验证层的时候,

public function navSet(NavRequest $request)//将你抽离的参数层绑定到这里

{

$request_params=$request->all();

//接下来处理你的业务逻辑...

}

这样不管你在哪里绑定Navrequest这个参数验证类的时候,都会对参数进行验证

验证错误信息的返回

在这个地方我是写接口的,无论如何都接收不到错误信息.然后查看FoemRequest的错误返回信息:

看到这里这样写:如下图.

protected function failedValidation(Validator $validator)

{

throw (new ValidationException($validator))

->errorBag($this->errorBag)

->redirectTo($this->getRedirectUrl());

}

public function rules(){

return [

'account'=>[

'required',

'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/',//验证为手机号,邮箱,或帐号

],

'password'=>'required|between:6,18',//验证密码

];

}

public function messages(){

return [

'account.required' => '帐号不能为空',

'account.regex' => '帐号不合法',

'password.required'  => '密码不能为空',

'password.between'  => '密码错误',

];

}

看一看图文教程:

1、首先创建验证器

1569033086120546.png

1569033172720591.png

如果是false ,则禁止访问,也不会运行controller,且会返回一个http 403 的状态码

1569033640108685.png

User.phpnamespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

use Illuminate\Contracts\Validation\Validator;

class User extends FormRequest {

/**

* Determine if the user is authorized to make this request.

*

* @return bool

*/

public function authorize() {

return TRUE;

}

/**

* Get the validation rules that apply to the request.

*

* @return array

*/

public function rules() {

return [

'id' => 'required|int'

];

}

protected function failedValidation(Validator $validator) {

//echo '1111111111';

var_dump($validator->getMessageBag());

exit;

/*  throw (new ValidationException($validator))

->errorBag($this->errorBag)

->redirectTo($this->getRedirectUrl());*/

}

}

验证规则中,正则的写法:class User extends FormRequest {

/**

* Determine if the user is authorized to make this request.

*

* @return bool

*/

public function authorize() {

return TRUE;

}

/**

* Get the validation rules that apply to the request.

*

* @return array

*/

public function rules() {

return [

'id' => 'required|int',

'phone'=>[

'required',

'regex:/^1\d{10}$/'

//'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/'

]

];

}

public function attributes() {

return [

'phone'=>'手机号'

];

}

public function messages() {

return [

'phone.required'=>'手机号不能为空',

'phone.regex'=>'手机号不正确',

];

}

protected function failedValidation(Validator $validator) {

//echo '1111111111';

var_dump($validator->getMessageBag());

exit;

/*  throw (new ValidationException($validator))

->errorBag($this->errorBag)

->redirectTo($this->getRedirectUrl());*/

}

}

1569034747915924.png

1569034854274559.png

public function rules() {

return [

'id' => 'required|int',

'phone' => [

'required',

'regex:/^1\d{10}$/'

//'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/'

],

'age' => [

'required',

'int',

function ($attribute, $value, $fail) {

//这里可以做逻辑验证 注意 在这里  $attribute 是属性名,且不能和messages中的值别名替换。

if($value<10 || $value>100 ){

return $fail($attribute.'不能小于10岁且不能大于100');

}

}

]

];

}

public function attributes() {

return [

'phone' => '手机号',

'age' =>'年龄'

];

}

public function messages() {

return [

'phone.required' => '手机号不能为空',

'phone.regex' => '手机号不正确',

];

}

1569035812658384.png

1569035586127965.png

昨日验证通过 这里的方法重写,得到pathinfo上的值,就可以实现路由验证/**

* Create the default validator instance.

*

* @param  \Illuminate\Contracts\Validation\Factory  $factory

* @return \Illuminate\Contracts\Validation\Validator

*/

protected function createDefaultValidator(ValidationFactory $factory)

{

$data=array_merge($this->route()->parameters(),$this->validationData());

//echo "

";

//echo __FILE__."  ".__LINE__."
";

//dd($pid);

//echo "

";

//exit;

//   dd($this->validationData());

return $factory->make(

$data, $this->container->call([$this, 'rules']),

$this->messages(), $this->attributes()

);

}

建议重写这个方法,

/**

* Get data to be validated from the request.

*

* @return array

*/

protected function validationData()

{

return $this->all();

return array_merge($this->route()->parameters(),$this->all()); 这样既可实现pathinfo上的值验证, 这是有顺序的,为了和 laravel的取值保持一致,先 get、post然后才pathinfo

}

validator 扩展:$this->app['validator']->extend('captcha', function ($attribute, $value, $parameters) {

return captcha_check($value);

});

// Validator extensions

$this->app['validator']->extend('captcha_api', function ($attribute, $value, $parameters) {

return captcha_api_check($value, $parameters[0]);

});

$rules = [

'result' => 'sometimes|integer|in:1,2',

'deviceSource' => 'sometimes|integer|in:' . implode(',', array_filter(SourceEnum::keys())),

'startTime' => 'sometimes|date',

'endTime' => 'sometimes|date|after:startTime'

];

$customAttributes = [

'result' => '结果',

'deviceSource' => '检测设备',

'startTime' => '起始时间',

'endTime' => '截止时间'

];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AliOS Things声源定位应用演示

1. 概述 利用麦克风阵列进行声源定位在智能降噪、语音增强、语音识别等领域有广泛应用和研究前景。本文介绍基于AliOS Things STM32F413H Discovery开发板实现声源定位算法集成和功能演示。 声源定位算法 本案例集成了STMicroelectronics的Acoustic_SL声源定位算法。Acousti…

可优比和aag哪个好_火花塞多级和单级哪个性能更好?多就等于好?这可未必

从电极数量来判断火花塞性能&#xff0c;选择火花塞的一个误区&#xff01;不知从何时开始&#xff0c;很多车友选择火花塞特别迷信侧电极数量&#xff0c;认为侧电极数量越多&#xff0c;火花塞就越好&#xff0c;点火火花就越大。我估计这是被一些别有用心的人带节奏了&#…

Quick BI v3.0版本全新起航——2018杭州云栖大会

在9月22日杭州云栖大会云上数据中台专场中&#xff0c;阿里巴巴产品专家陌停跟现场的观众们分享了Quick BI v3.0版本的新体验、新分析和新功能。 作为一个高效数据分析与展现的BI套件&#xff0c;Quick BI通过拖拽式的可视化分析能力&#xff0c;让懂业务的人自助式实现数据分析…

IDEA配置JDK

IDEA配置JDK 项目应用JDK

漫画:我用深度学习框架画下女朋友最美的脸

这不&#xff0c;又一个程序员为爱变身灵魂画手&#xff0c;看得我都想学画画了。阿华是幸运的&#xff0c;因为他找到了对的方法&#xff0c;事半功倍&#xff0c;最终有情人终成眷属。这也得益于 PyTorch 的易学易用&#xff0c;大多数人第一次使用 PyTorch 几乎可以做到无痛…

云端一体化差分+安全升级,AliOS Things物联网升级“利器”

1.1 OTA升级简介 随着物联网的日益发展&#xff0c;OTA升级逐渐成为物联网设备的刚性需求&#xff0c;目前物联网设备种类繁多&#xff0c;但并未提供统一的OTA升级方案&#xff0c;针对日益发展的物联网设备&#xff0c;开发者迫切需要一套云端一体化的OTA升级方案来满足快速迭…

startlogging中设置setstdout=false来禁用这个功能。_Windows 10禁用USB选择性暂停设置,峰哥教你解决USB设备失灵问题...

最近发现在 Win10 笔记本中使用 U 盘或者连接一些 USB 外设的情况下&#xff0c;时不时会有设备失灵的现象。经过研究发现&#xff0c;微软为了节省电力&#xff0c;在 Win10 系统中内置了一项「USB 选择性暂停设置」&#xff0c;而这个功能默认还处于启用状态。启用「USB 选择…

数据库“新解”,看这里,get!

自从第一台通用计算机诞生至今&#xff0c;围绕计算机系统硬件的创新迭代就一直“在路上”&#xff0c;伴随着硬件能力的不断提升&#xff0c;软件更新自然不可缺少。通常来说在传统的计算机软件工程领域&#xff0c;操作系统、编译器与数据库被并称为最具难度的“三剑客”系统…

阿里云发布链路追踪服务Tracing Analysis

近日&#xff0c;在杭州云栖大会上&#xff0c;阿里云发布了链路追踪服务Tracing Analysis&#xff0c;成本是自建链路追踪系统的1/5或更少&#xff0c;可为分布式应用的开发者提供完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等工具&#xff0c;帮助开发者快速…

深入体验php项目开发.pdf,《深入体验PHP项目开发》.(谭贞军).[PDF]

090756q2fwgddoa5qto2kz.jpg (65.13 KB, 下载次数: 0)2018-8-8 14:24 上传本书介绍:php语言是当今使用最为频繁的网络编程语言之一&#xff0c;一直在开发web领域占据重要的地位。本书通过10个综合实例的实现过程&#xff0c;详细讲解了php语言在实践项目中的综合运用过程&…

DT时代下 数据库灾备的探索与实践

170余场主题峰会和分论坛完美呈现&#xff0c;上千位分享嘉宾、数万名创新创业导师齐聚一堂&#xff0c;刚刚结束的2018杭州云栖大会让云栖小镇又一次成为探索数字世界的中心。 随着DT时代的到来&#xff0c;企业对数据的依赖程度与日俱增&#xff0c;数据保护早已成为企业的一…

2019工作榜单:程序员吸金榜,AI排第一,这个我服!

先来看一个2019工作榜单&#xff1a;作为全球知名的招聘网站Indeed最近发布了一份2019年最佳工作榜单&#xff0c;公布了最有前景的行业和相应的岗位薪资:排名第一的是机器学习人工智能相关的岗位&#xff0c;从2015-2018岗位增加了3倍多&#xff0c;平均的年薪接近百万(98万)。…

node js fork php,Node.js中execFile,spawn,exec和fork简介

Node.js中execFile,spawn,exec和fork简介Node.js子流程child_process模块提供四种不同方法执行外部应用&#xff1a;所有这些都是异步&#xff0c;调用这些方法会返回一个对象&#xff0c;这对象是ChildProcess类的实例。1. execFile用于执行一个外部应用&#xff0c;应用退出后…

阿里云应用配置管理ACM发布,重新定义云上配置的存放方式

9月26日&#xff0c;阿里云宣布应用配置管理ACM产品正式商用&#xff0c;将重新定义云上配置的存放方式。 据了解&#xff0c;该产品具备亿级应用配置处理能力&#xff0c;将分布式架构下的应用配置管理智能化&#xff0c;极大的降低了在微服务、Devops、大数据等场景下配置管…

IDEA远程连接mysq数据库

#测试连接串 jdbc:mysql://localhost:3306/flowable-base?useUnicodetrue&characterEncodingutf8&zeroDateTimeBehaviorconvertToNull&useSSLtrue&serverTimezoneGMT%2B8

黑科技揭秘:网红“天空物联网飞艇”服务范围为何能突破30公里

2018杭州云栖大会的网红飞艇&#xff0c;搭载LoRaWAN网关&#xff0c;与地面网关一起组成上天入地的天空物联网服务&#xff0c;获得众多关注。其最主要的核心是Link WAN物联网络管理平台&#xff0c;提供了网关管理与设备快数接入云端&#xff0c;使得飞艇挂载网关十分容易。 …

雪花算法(snowflake) :分布式环境,生成全局唯一的订单号 | CSDN 博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 琦彦 责编 | 阿秃转自 &#xff5c; CSDN 博客snowflake方案snowflake是Twitter开源的分布式ID生成算法&#xff0c;结果是一个long型的ID。这种方案大致来说是一种以划分命名空间&#xff08;UUID也算&#xff0c;由于比较…

RabbitMQ+haproxy+keeplived 高可用负载均衡高可用镜像集群队列_01

文章目录一、RabbitMQ 集群节点说明二、服务器hosts文件统一修改三、RabbitMQ 镜像集群队列搭建部署一、RabbitMQ 集群节点说明 服务器IPhostname节点说明端口管控台地址账号密码192.168.0.115mq-01rabbitmq master5672http://192.168.0.115:15672guestguest192.168.0.117mq-0…

vue click事件_Vue.js---实现前后端分离架构中前端页面搭建(二)

【Vue.js实现前后端分离架构中前端页面搭建】九、Vue的事件处理Vue的事件都是使用 v-on:事件类型 进行绑定。也可以使用事件类型进行操作。其中事件类型和之前学习jQuery中事件名称是一样。示例中都是以点击事件为例。1. 直接操作属性值代码示例中通过点击按钮对counter值加一。…