控制器直接验证
好处是在控制器一眼就能看到有那些验证规则,复用性比较差,每个方法都需要复制一份
1.validate助手函数验证
示例代码
$params = input();
//验证
try {
validate([
'name|商品名称' => 'require|chsDash',
'desc|商品描述' => 'require|chsDash',
'imgs|商品图片' => 'require|checkimgs',
'stock|库存' => 'require|number|>:0',
'sell_price|售价' => 'require|float|>:0',
])->check($params);
} catch (ValidateException $exception) {
return fail($exception->getMessage());
}
全局拓展验证规则
我们看到上面的代码有个自定义验证规则checkimgs ,我们需要在 api/app/AppService.php 文件的boot方法中写验证规则,具体可以参看官方手册 参考
// 服务启动
Validate::maker(function ($validate) {
$validate->extend('checkimgs', function ($value) {
if (!is_array($value)) {
return false;
}
foreach ($value as $v) {
return in_array(pathinfo($v, PATHINFO_EXTENSION), ['jpeg', 'jpg', 'png']);
}
return true;
}, ':attribute格式错误');
});
extend 方法,第二个参数是一个匿名函数,返回值必须是true 或者false
自定义错误信息
还可以给自定义规则自定义错误信息
//验证
try {
validate([
'name|商品名称' => 'require|chsDash',
'desc|商品描述' => 'require|chsDash',
'imgs|商品图片' => 'require|checkimgs',
'stock|库存' => 'require|number|>:0',
'sell_price|售价' => 'require|float|>:0',
],[
'imgs.require'=>'商品图片必填',
'imgs.checkimgs'=>'商品图片必须是一个数组,且格式为jpeg,jpg,png',
])->check($params);
} catch (ValidateException $exception) {
return fail($exception->getMessage());
}
如果是使用这种方式验证,那么自定义规则方法必须返回true 或者false ,返回字符串就会报错
2.rule方法验证
参考地址: https://www.kancloud.cn/manual/thinkphp6_0/1037625
示例代码
同样需要在api/app/AppService.php 文件的boot方法中写验证规则
Validate::maker(function ($validate) {
$validate->extend('check_float', function ($value, $rule) {
$ruleArr = explode(',', $rule);
$ruleIntLong = $ruleArr[0]; //整数位数
$ruleFloatLong = $ruleArr[1]; //小数位数
$valueArr = explode('.', $value);
$valueIntLong = strlen($valueArr[0]);
$valueFloatLong = isset($valueArr[1]) ? strlen($valueArr[1]) : 0;
return $ruleFloatLong < $valueFloatLong ? false : true;
}, ':attribute格式错误');
});
在控制器调用
$params = input();
$validate = Validate::rule([
'num|数字' => 'require|check_float:3,3',
]);
$validate->message([
'num.require' => '这是必填的哦,不填你是想怎么样?',
// 'num.check_float' => '数字不规范呀',
]);
if (!$validate->check($params)) {
return fail($validate->getError());
}
自定义错误消息
如果自定义的验证规则方法中,返回的是true 或false ,那么当返回为false 的时候,可以提示自定义的消息,如果方法中直接返回的字符串 和true ,那么$validate->message 方法中对自定义规则进行错误消息自定义是无效的,它会直接使用返回的字符串内容作为错误信息。
比如我们返回字符串 和true
Validate::maker(function ($validate) {
$validate->extend('check_float', function ($value, $rule) {
$ruleArr = explode(',', $rule);
$ruleIntLong = $ruleArr[0]; //整数位数
$ruleFloatLong = $ruleArr[1]; //小数位数
$valueArr = explode('.', $value);
$valueIntLong = strlen($valueArr[0]);
$valueFloatLong = isset($valueArr[1]) ? strlen($valueArr[1]) : 0;
return $ruleFloatLong < $valueFloatLong ? '小数位长度不能大于' . $ruleFloatLong . '位!' : true;
}, ':attribute格式错误');
});
同时在控制器中$validate->message 方法里也定义了错误信息
$params = input();
$validate = Validate::rule([
'num|数字' => 'require|check_float:3,3',
]);
$validate->message([
'num.require' => '这是必填的哦,不填你是想怎么样?',
'num.check_float' => '数字不规范呀',
]);
if (!$validate->check($params)) {
return fail($validate->getError());
}
我们传递一个测试数值试试 我们看到及时,我们传递了自定义错误信息,它是没有效果的。
创建验证器验证
好处是复用性比较好,假如你开发了一个项目写了很多值得收藏的验证规则,那么下个项目开始的话直接复制粘贴所有文件就可以了,毕竟是单独的一个文件夹,如果是控制器的话,还需要再去复制验证规则,假如有很多地方都需要验证,那么直接调用就行了了,缺点,每次都要创建一个验证类文件,每次查看规则都要再跳转一个文件
1.创建验证器
php think make:validate adminapi@Goods
<?php
declare (strict_types=1);
namespace app\adminapi\validate;
use think\Validate;
class Goods extends Validate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'id' => 'require|number',
'name|商品名称' => 'require|chsDash',
'desc|商品描述' => 'require|chsDash',
'imgs|商品图片' => 'require|checkImg',
'stock|库存' => 'require|number|>:0',
'sell_price|售价' => 'require|float|>:0',
'category_id|分类ID' => 'require|number',
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [];
protected $scene = [
'save' => ['name', 'desc', 'imgs', 'stock', 'sell_price','category_id'],
'update' => ['id', 'name', 'desc', 'imgs', 'stork', 'sell_price','category_id'],
];
protected function checkImg($imgs)
{
$imgs = json_decode($imgs, true);
if (!is_array($imgs)) {
return '请重新上传图片';
}
foreach ($imgs as $img) {
return in_array(pathinfo($img, PATHINFO_EXTENSION), ['jpeg', 'jpg', 'png']);
}
return true;
}
}
2.控制器调用
$params = input();
try {
validate(\app\adminapi\validate\Goods::class)
->scene('save')
->check($params);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return fail($e->getError());
}
|