Appearance
验证器层
验证器组件
验证器使用illuminate/validation
组件,内置了手机号和时间区间验证规则,如需新增验证规则,请在plugin/jmsadmin/config/validator.php
配置文件中添加
php
<?php
return [
'mobile' => [
'passes' => function ($attribute, $value, $parameters, $validator) {
return preg_match('/^1[3-9]\d{9}$/', $value) === 1;
},
'replacer' => function ($message, $attribute, $rule, $parameters) {
return $message;
}
],
'date_between' => [
'passes' => function ($attribute, $value, $parameters, $validator) {
if (!is_array($value) || count($value) != 2 || !strtotime($value[0]) || !strtotime($value[1]) || strtotime($value[0]) > strtotime($value[1])) {
return false;
}
return true;
},
'replacer' => function ($message, $attribute, $rule, $parameters) {
return $message;
}
]
];
注意
验证器只支持基本验证,暂不支持上传文件验证和依赖数据库的验证
验证器的定义
请在plugin/jmsadmin/app/validate
目录下相应的模块中定义验证器,这点很重要,因为service某些逻辑可能会按约定寻找验证器文件,验证器类需要大驼峰式命名,并继承验证器基类,以参数设置验证器为例
php
<?php
namespace plugin\jmsadmin\app\validate\system;
use plugin\jmsadmin\basic\BasicValidate;
/**
* 参数配置Validate
* @author JM Code Generator
*/
class ConfigValidate extends BasicValidate
{
......
字段的配置
php
/**
* 接受用户输入的字段
* @var string[]
*/
protected $field = [
'configId' => '参数主键',
'configName' => '参数名称',
'configKey' => '参数键名',
'configValue' => '参数键值',
'configType' => '系统内置',
'remark' => '备注',
];
此配置有以下作用
- 配置中的字段未必是数据库中的字段,但一定是业务逻辑需要的字段
- 配置中的字段包含该业务全部场景所需的字段
- 验证时会将字段及名称关系传递给验证器,以便精准提示错误信息
- 验证通过后会返回对应的数据
- 此处不应该配置数据库中的敏感字段,如
create_by
,update_by
,delete_time
等
通用验证规则的配置
php
/**
* 需要验证字段的通用验证规则
* @var string[]
*/
protected $rule = [
'configId' => 'integer',
'configName' => 'max:100',
'configKey' => 'max:100',
'configValue' => 'max:500',
'configType' => 'max:1',
'remark' => 'max:500',
];
- 此处配置的是通用的规则,具体场景差异需要在场景验证规则中补充,如
required
规则不应该在此处定义,如configName
在新增和修改时必填,但搜索时选填,所以此处只定义长度规则
场景验证规则的配置
php
/**
* search场景规则
* @return array
*/
public function sceneRuleSearch()
{
return [
//接收用户输入字段列表
'field' => ['configName', 'configKey', 'configValue', 'configType', 'createTime'],
//必填字段列表
'required' => [],
//场景专属验证规则列表
'rule' => ['createTime' => 'date_between', ]
];
}
- 以搜索场景规则为例,方法需要是
public
的,方法名由sceneRule
+大驼峰的场景名组成 field
定义该场景可以接收哪些数据required
定义该场景哪些数据必填rule
定义该场景专属验证规则
验证器的使用
在需要使用验证器的位置,如DeptController
中的list
接口
php
$params = $this->validate->run('search', $request->get());
search
参数代表场景名称,$request->get()
代表需要验证的数据源,验证器中的run
方法验证失败会抛出异常,验证成功会返回接收到的数据
多个验证器同时使用
在复杂的场景中,需要验证和接收的可能是多个业务的数据,如果get
或post
传递的是键值对,可以调用各自验证器进行验证并接收数据,如:
php
$oneValidate = new OneValidate();
$twoValidate = new TwoValidate();
$oneData = $oneValidate->run('add', $request->post());
$twoData = $twoValidate->run('add', $request->post());
如果two数据是数组
php
$twoData = $twoValidate->run('add', $request->post('two'));
如果two数据是二维数组
php
$twoData = [];
$two = $request->post('two');
foreach ($two as $row) {
$twoData[] = $twoValidate->run('add', $row);
}