Skip to content

Support using model name like App\\Model\\User for validatoin rule exists and unique.#7459

Merged
limingxinleo merged 10 commits intohyperf:masterfrom
MorriosL:feat/validation-rules-database
Feb 4, 2026
Merged

Support using model name like App\\Model\\User for validatoin rule exists and unique.#7459
limingxinleo merged 10 commits intohyperf:masterfrom
MorriosL:feat/validation-rules-database

Conversation

@MorriosL
Copy link
Contributor

目前的规则默认会使用default的数据库连接,当使用多个数据库连接时需要手动拼接连接名称。

传递ModelName::class作为table的值后,会自动解析模型的连接名和表明。

该功能从Laravel同步。

@limingxinleo
Copy link
Member

单测也一块搬过来

@MorriosL
Copy link
Contributor Author

单测已经加了,帮忙看看README这样改行不行,可以的话我再把其他语言的README补充了

image

@huangdijia
Copy link
Member

代码审查结果

功能概述

此PR为验证器的数据库相关规则(existsunique)添加了支持传递 ModelName::class 格式的table参数功能。当传递模型类名时,系统会自动解析模型的连接名和表名,避免在多数据库连接场景下手动拼接连接名称。

代码分析

核心实现

DatabaseRule.php 中新增了 resolveTableName() 方法:

  1. 参数检查:验证传入的字符串是否包含反斜杠并且是有效的类
  2. 模型检查:确认类是否继承自 Model
  3. 表名解析
    • 如果模型表名已包含连接名(含点号),直接返回原表名
    • 否则组合连接名和表名,格式为 连接名.表名

优点

  • 代码简洁:避免手动拼接数据库连接名
  • 兼容性好:保持向后兼容,对非模型类参数无影响
  • Laravel同步:与Laravel框架保持一致的功能特性

潜在问题

  1. 性能考虑:每次验证都会实例化模型对象 new $table(),可能影响性能
  2. 错误处理:缺少对模型实例化异常的处理
  3. 代码逻辑:当表名已包含点号时直接返回 $table(类名)而非表名,逻辑可能有误

建议改进

  1. 性能优化:考虑缓存模型实例或使用静态方法获取表信息
  2. 异常处理:添加模型实例化的异常捕获
  3. 确认逻辑:当表名包含点号时的处理逻辑是否正确

测试覆盖

测试用例较为完整,涵盖了:

  • 基本的模型类解析功能
  • 连接名和表名的正确组合
  • 字符串格式化输出验证

总体评价

这是一个实用的功能增强,能够简化多数据库连接场景下的验证规则使用。代码整体结构合理,测试覆盖充分,建议在考虑上述改进点后合并。

@MorriosL
Copy link
Contributor Author

已按照建议调整了代码,也补充了文档

@MorriosL
Copy link
Contributor Author

MorriosL commented Feb 3, 2026

@limingxinleo 这个PR也处理好了,麻烦帮忙看看,谢谢

limingxinleo
limingxinleo previously approved these changes Feb 4, 2026
@limingxinleo limingxinleo changed the title feat: 验证器涉及到数据表相关的规则,添加table参数传递ModelName::class格式的支持 Support using model name like App\\Model\\User for validatoin rule exists and unique. Feb 4, 2026
@limingxinleo limingxinleo merged commit 6c14022 into hyperf:master Feb 4, 2026
77 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants