本目录包含通知模块的所有验证器类,用于验证通知相关的数据。
通知验证器,用于验证通知数据的有效性。
class NotificationValidator extends BaseValidator
{
/**
* 验证规则
*
* @var array
*/
protected $rules = [
'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())
];
/**
* 验证消息
*
* @var array
*/
protected $messages = [
'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' => '无效的状态'
];
/**
* 验证通知数据
*
* @param array $data
* @return bool
*/
public function validate(array $data)
{
// 1. 验证基本数据
if (!$this->validateBasic($data)) {
return false;
}
// 2. 验证模板变量
if (!$this->validateTemplateVariables($data)) {
return false;
}
// 3. 验证渠道特定规则
if (!$this->validateChannelRules($data)) {
return false;
}
return true;
}
/**
* 验证基本数据
*
* @param array $data
* @return bool
*/
protected function validateBasic(array $data)
{
return $this->validate($data, $this->rules, $this->messages);
}
/**
* 验证模板变量
*
* @param array $data
* @return bool
*/
protected function validateTemplateVariables(array $data)
{
// 获取模板信息
$template = NotificationTemplate::find($data['template_id']);
if (!$template) {
$this->errors->add('template_id', '模板不存在');
return false;
}
// 获取模板变量
$variables = json_decode($template->variables, true);
if (!$variables) {
return true;
}
// 验证变量是否存在
foreach ($variables as $variable => $type) {
if (!isset($data['data'][$variable])) {
$this->errors->add('data', "缺少模板变量:{$variable}");
return false;
}
// 验证变量类型
if (!$this->validateVariableType($data['data'][$variable], $type)) {
$this->errors->add('data', "变量 {$variable} 类型错误");
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)
{
if (!isset($data['to']) || !filter_var($data['to'], FILTER_VALIDATE_EMAIL)) {
$this->errors->add('to', '无效的邮箱地址');
return false;
}
return true;
}
/**
* 验证短信规则
*
* @param array $data
* @return bool
*/
protected function validateSmsRules(array $data)
{
if (!isset($data['phone']) || !preg_match('/^1[3-9]\d{9}$/', $data['phone'])) {
$this->errors->add('phone', '无效的手机号码');
return false;
}
return true;
}
/**
* 验证推送规则
*
* @param array $data
* @return bool
*/
protected function validatePushRules(array $data)
{
if (!isset($data['device_token']) || empty($data['device_token'])) {
$this->errors->add('device_token', '设备令牌不能为空');
return false;
}
return true;
}
}
模板验证器,用于验证通知模板数据的有效性。
class TemplateValidator extends BaseValidator
{
/**
* 验证规则
*
* @var array
*/
protected $rules = [
'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'
];
/**
* 验证消息
*
* @var array
*/
protected $messages = [
'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' => '无效的状态'
];
/**
* 验证模板数据
*
* @param array $data
* @return bool
*/
public function validate(array $data)
{
// 1. 验证基本数据
if (!$this->validateBasic($data)) {
return false;
}
// 2. 验证变量定义
if (!$this->validateVariables($data)) {
return false;
}
return true;
}
/**
* 验证基本数据
*
* @param array $data
* @return bool
*/
protected function validateBasic(array $data)
{
return $this->validate($data, $this->rules, $this->messages);
}
/**
* 验证变量定义
*
* @param array $data
* @return bool
*/
protected function validateVariables(array $data)
{
if (!isset($data['variables'])) {
return true;
}
$variables = json_decode($data['variables'], true);
if (!$variables) {
$this->errors->add('variables', '变量定义格式错误');
return false;
}
foreach ($variables as $variable => $type) {
if (!in_array($type, ['string', 'integer', 'float', 'array', 'boolean'])) {
$this->errors->add('variables', "变量 {$variable} 类型错误");
return false;
}
}
return true;
}
}
$validator = new NotificationValidator();
$data = [
'template_id' => 1,
'type' => NotificationType::SYSTEM,
'channel' => NotificationChannel::MAIL,
'title' => '测试通知',
'content' => '这是一条测试通知',
'data' => [
'name' => '张三',
'amount' => 100
],
'priority' => NotificationPriority::NORMAL,
'status' => NotificationStatus::PENDING,
'to' => 'example@example.com'
];
if ($validator->validate($data)) {
// 验证通过,处理数据
} else {
// 验证失败,获取错误信息
$errors = $validator->getErrors();
}
$validator = new TemplateValidator();
$data = [
'name' => '测试模板',
'type' => NotificationType::SYSTEM,
'channel' => NotificationChannel::MAIL,
'title' => '测试通知',
'content' => '这是一条测试通知',
'variables' => json_encode([
'name' => 'string',
'amount' => 'integer'
]),
'status' => 1
];
if ($validator->validate($data)) {
// 验证通过,处理数据
} else {
// 验证失败,获取错误信息
$errors = $validator->getErrors();
}