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、首先创建验证器
如果是false ,则禁止访问,也不会运行controller,且会返回一个http 403 的状态码
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());*/
}
}
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' => '手机号不正确',
];
}
昨日验证通过 这里的方法重写,得到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' => '截止时间'
];
php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证相关推荐
- 关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决
关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决 参考文章: (1)关于Laravel中使用response()方法调用json()返回数据un ...
- table中加表单元素怎么验证_el-table嵌入表单元素注意事项(验证规则prop写法与数据初始化)...
场景:在el-table表格中嵌入表单元素 绑定数据: table : :data="planFormData.allocationPlan" el-form-item: v-mo ...
- el-form 验证规则里prop一次验证两个或多个值
<el-form-item label="高度范围" prop="high_min"><div class="row-input-h ...
- 通过VBA在Excel中添加复选输入框,实现数据验证不能做到的多选
第一步:在相应表格中添加一个ActiveX控件:ListBox1 第二步:增加一个表格"发病情况",在相应数据区(A2:A10)增加复选项目数据 发病情况 干咳 乏力 发热 咽痛 ...
- php validate验证用户,PHP validate 数据验证demo
namespace app\index\controller; use think\Validate; class Index { public function index() { return v ...
- yii2中的rules验证规则
2019独角兽企业重金招聘Python工程师标准>>> Rules验证规则:required : 必须值验证属性||CRequiredValidator 的别名, 确保了特性不为空. ...
- php字段验证规则,详解ThinkPHP中自动验证及验证规则
本篇文章详细介绍了thinkphp中自动验证及验证规则的方法,希望对学习thinkphp的朋友有帮助! 详解ThinkPHP中自动验证及验证规则 ThinkPHP 内置了数据对象的自动验证功能来完成模 ...
- Element UI 表单在el-form-item中使用自定义验证规则
1:官网示例 <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleFo ...
- 教你三种Model(AR)中自定义验证规则的方法
2019独角兽企业重金招聘Python工程师标准>>> 各位Yii2兄弟都知道Model的rules里面可以使用自己定义的验证规则,我们今天就把自定义规则做一个总结,进行一次彻底的知 ...
最新文章
- QUARK的增强版C-QUARK问世,有效提升蛋白质结构从头预测精度
- 数字内容交易平台php,Demila数字内容交易系统 v1.0
- HDU5320 : Fan Li
- python turtle渐变色_如何在matplotlib中绘制渐变色线?
- 奇怪的匿名函数之争EventHandler
- ArrayList去除集合中字符串的重复值
- uoj#38. 【清华集训2014】奇数国(线段树+数论)
- 烂泥:学习ssh之ssh密钥随身携带
- uni-app开发微信小程序上传提示以下文件没有被打包上传
- OpenCV图像处理基础操作(4)
- mysql_query is deprecated_Function mysql_db_query() is deprecated 错误解决
- mongodb 基础 命令 学习
- Redis-使用redis-trib构建集群
- Kbps、KBps是什么意思?网络下载速度单位换算
- TS2307: Cannot find module ‘vant‘ or its corresponding type declarations
- killall杀死nginx顽固进程
- 倒计时1天!大会议程全公开,论坛介绍看起来
- 使用SCRAPY框架获取网易云排行榜歌单
- 计算机考研报录比10比1,2020考研报录比高达10:1!2021择校应避开哪些重灾区?
- xxl-job分布式任务调度中心部署实践(1)