Skip to content

验证器层

验证器组件

验证器使用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方法验证失败会抛出异常,验证成功会返回接收到的数据

多个验证器同时使用

在复杂的场景中,需要验证和接收的可能是多个业务的数据,如果getpost传递的是键值对,可以调用各自验证器进行验证并接收数据,如:

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);
}