notfff 693477b517 feat(GenerateModelAnnotation): 支持自定义Casts类型 7 месяцев назад
..
README.md 693477b517 feat(GenerateModelAnnotation): 支持自定义Casts类型 7 месяцев назад

README.md

通知模块验证规则类文档

验证规则类说明

本目录包含通知模块的所有验证规则类,用于定义通知相关的验证规则。

验证规则类列表

1. NotificationValidation

通知验证规则类,用于定义通知相关的验证规则。

class NotificationValidation extends BaseValidation
{
    /**
     * 创建验证规则
     *
     * @return array
     */
    public function createRules()
    {
        return [
            'template_id' => 'required|integer|exists:notification_templates,id',
            'type' => 'required|string|in:' . implode(',', NotificationType::getList()),
            'channel' => 'required|string|in:' . implode(',', NotificationChannel::getList()),
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'data' => 'nullable|array',
            'priority' => 'required|integer|in:' . implode(',', NotificationPriority::getList()),
            'status' => 'required|string|in:' . implode(',', NotificationStatus::getList())
        ];
    }

    /**
     * 更新验证规则
     *
     * @return array
     */
    public function updateRules()
    {
        return [
            'template_id' => 'sometimes|required|integer|exists:notification_templates,id',
            'type' => 'sometimes|required|string|in:' . implode(',', NotificationType::getList()),
            'channel' => 'sometimes|required|string|in:' . implode(',', NotificationChannel::getList()),
            'title' => 'sometimes|required|string|max:255',
            'content' => 'sometimes|required|string',
            'data' => 'nullable|array',
            'priority' => 'sometimes|required|integer|in:' . implode(',', NotificationPriority::getList()),
            'status' => 'sometimes|required|string|in:' . implode(',', NotificationStatus::getList())
        ];
    }

    /**
     * 获取验证消息
     *
     * @return array
     */
    public function messages()
    {
        return [
            'template_id.required' => '模板ID不能为空',
            'template_id.exists' => '模板不存在',
            'type.required' => '通知类型不能为空',
            'type.in' => '无效的通知类型',
            'channel.required' => '通知渠道不能为空',
            'channel.in' => '无效的通知渠道',
            'title.required' => '通知标题不能为空',
            'title.max' => '通知标题不能超过255个字符',
            'content.required' => '通知内容不能为空',
            'priority.required' => '优先级不能为空',
            'priority.in' => '无效的优先级',
            'status.required' => '状态不能为空',
            'status.in' => '无效的状态'
        ];
    }

    /**
     * 获取自定义验证规则
     *
     * @return array
     */
    public function customRules()
    {
        return [
            'validate_template_variables' => function ($attribute, $value, $parameters) {
                return $this->validateTemplateVariables($value);
            },
            'validate_channel_rules' => function ($attribute, $value, $parameters) {
                return $this->validateChannelRules($value);
            }
        ];
    }

    /**
     * 验证模板变量
     *
     * @param array $data
     * @return bool
     */
    protected function validateTemplateVariables(array $data)
    {
        // 获取模板信息
        $template = NotificationTemplate::find($data['template_id']);
        if (!$template) {
            return false;
        }

        // 获取模板变量
        $variables = json_decode($template->variables, true);
        if (!$variables) {
            return true;
        }

        // 验证变量是否存在
        foreach ($variables as $variable => $type) {
            if (!isset($data['data'][$variable])) {
                return false;
            }

            // 验证变量类型
            if (!$this->validateVariableType($data['data'][$variable], $type)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 验证变量类型
     *
     * @param mixed $value
     * @param string $type
     * @return bool
     */
    protected function validateVariableType($value, $type)
    {
        switch ($type) {
            case 'string':
                return is_string($value);
            case 'integer':
                return is_numeric($value) && is_int($value + 0);
            case 'float':
                return is_numeric($value);
            case 'array':
                return is_array($value);
            case 'boolean':
                return is_bool($value);
            default:
                return true;
        }
    }

    /**
     * 验证渠道特定规则
     *
     * @param array $data
     * @return bool
     */
    protected function validateChannelRules(array $data)
    {
        switch ($data['channel']) {
            case NotificationChannel::MAIL:
                return $this->validateMailRules($data);
            case NotificationChannel::SMS:
                return $this->validateSmsRules($data);
            case NotificationChannel::PUSH:
                return $this->validatePushRules($data);
            default:
                return true;
        }
    }

    /**
     * 验证邮件规则
     *
     * @param array $data
     * @return bool
     */
    protected function validateMailRules(array $data)
    {
        return isset($data['to']) && filter_var($data['to'], FILTER_VALIDATE_EMAIL);
    }

    /**
     * 验证短信规则
     *
     * @param array $data
     * @return bool
     */
    protected function validateSmsRules(array $data)
    {
        return isset($data['phone']) && preg_match('/^1[3-9]\d{9}$/', $data['phone']);
    }

    /**
     * 验证推送规则
     *
     * @param array $data
     * @return bool
     */
    protected function validatePushRules(array $data)
    {
        return isset($data['device_token']) && !empty($data['device_token']);
    }
}

2. TemplateValidation

模板验证规则类,用于定义通知模板相关的验证规则。

class TemplateValidation extends BaseValidation
{
    /**
     * 创建验证规则
     *
     * @return array
     */
    public function createRules()
    {
        return [
            'name' => 'required|string|max:100',
            'type' => 'required|string|in:' . implode(',', NotificationType::getList()),
            'channel' => 'required|string|in:' . implode(',', NotificationChannel::getList()),
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'variables' => 'nullable|json',
            'status' => 'required|integer|in:0,1'
        ];
    }

    /**
     * 更新验证规则
     *
     * @return array
     */
    public function updateRules()
    {
        return [
            'name' => 'sometimes|required|string|max:100',
            'type' => 'sometimes|required|string|in:' . implode(',', NotificationType::getList()),
            'channel' => 'sometimes|required|string|in:' . implode(',', NotificationChannel::getList()),
            'title' => 'sometimes|required|string|max:255',
            'content' => 'sometimes|required|string',
            'variables' => 'nullable|json',
            'status' => 'sometimes|required|integer|in:0,1'
        ];
    }

    /**
     * 获取验证消息
     *
     * @return array
     */
    public function messages()
    {
        return [
            'name.required' => '模板名称不能为空',
            'name.max' => '模板名称不能超过100个字符',
            'type.required' => '通知类型不能为空',
            'type.in' => '无效的通知类型',
            'channel.required' => '通知渠道不能为空',
            'channel.in' => '无效的通知渠道',
            'title.required' => '通知标题不能为空',
            'title.max' => '通知标题不能超过255个字符',
            'content.required' => '通知内容不能为空',
            'variables.json' => '变量定义格式错误',
            'status.required' => '状态不能为空',
            'status.in' => '无效的状态'
        ];
    }

    /**
     * 获取自定义验证规则
     *
     * @return array
     */
    public function customRules()
    {
        return [
            'validate_variables' => function ($attribute, $value, $parameters) {
                return $this->validateVariables($value);
            }
        ];
    }

    /**
     * 验证变量定义
     *
     * @param string $value
     * @return bool
     */
    protected function validateVariables($value)
    {
        if (empty($value)) {
            return true;
        }

        $variables = json_decode($value, true);
        if (!$variables) {
            return false;
        }

        foreach ($variables as $variable => $type) {
            if (!in_array($type, ['string', 'integer', 'float', 'array', 'boolean'])) {
                return false;
            }
        }

        return true;
    }
}

使用示例

验证通知数据

$validation = new NotificationValidation();

// 创建验证
$rules = $validation->createRules();
$messages = $validation->messages();
$customRules = $validation->customRules();

$validator = Validator::make($data, $rules, $messages, $customRules);

if ($validator->fails()) {
    $errors = $validator->errors();
}

// 更新验证
$rules = $validation->updateRules();
$messages = $validation->messages();
$customRules = $validation->customRules();

$validator = Validator::make($data, $rules, $messages, $customRules);

if ($validator->fails()) {
    $errors = $validator->errors();
}

验证模板数据

$validation = new TemplateValidation();

// 创建验证
$rules = $validation->createRules();
$messages = $validation->messages();
$customRules = $validation->customRules();

$validator = Validator::make($data, $rules, $messages, $customRules);

if ($validator->fails()) {
    $errors = $validator->errors();
}

// 更新验证
$rules = $validation->updateRules();
$messages = $validation->messages();
$customRules = $validation->customRules();

$validator = Validator::make($data, $rules, $messages, $customRules);

if ($validator->fails()) {
    $errors = $validator->errors();
}

注意事项

  1. 所有验证规则类都继承自BaseValidation基类
  2. 支持创建和更新两种验证规则
  3. 支持自定义验证消息
  4. 支持自定义验证规则
  5. 支持变量类型验证
  6. 支持渠道特定规则验证
  7. 支持JSON格式验证
  8. 支持验证规则扩展
  9. 支持验证规则复用
  10. 支持验证规则组合