如何在Api-platform(Symfony)中避免重复条目触发SQL异常问题
问题原因与解决方案
1. 核心错误:@UniqueEntity 注解用法错误
你当前的写法 @UniqueEntity({"email", "anonymousGuid", "qrcode" }) 的作用是校验三个字段的组合值唯一,不是每个字段分别唯一,所以单个字段重复时不会触发应用层验证,请求直接到达数据库层抛出SQL异常。
你需要为每个需要单独校验唯一性的字段添加独立的 @UniqueEntity 注解:
/** * @UniqueEntity("email") * @UniqueEntity("anonymousGuid") * @UniqueEntity("qrcode") */ class User implements UserInterface, PasswordAuthenticatedUserInterface {
2. 检查验证开关配置
- 确认
config/packages/api_platform.yaml中验证功能已启用,默认配置是开启的,如果你手动修改过,需要确保存在以下配置:
api_platform: validation: enabled: true
- 确认你的
User实体的@ApiResource注解中没有手动禁用验证,即不存在validation: false配置。
3. 校验组匹配检查
你的实体属性配置了序列化组 user_write,如果你的接口提交时指定了该组作为验证组,需要给 @UniqueEntity 注解也绑定对应的组,否则验证不会触发:
/** * @UniqueEntity("email", groups={"user_write"}) * @UniqueEntity("anonymousGuid", groups={"user_write"}) * @UniqueEntity("qrcode", groups={"user_write"}) */
额外说明
属性上的 unique=true 仅用于ORM建表时生成数据库唯一索引,属于数据库层的兜底约束,不会触发应用层的验证逻辑,不需要额外写手动校验代码,只要按上述规则配置好 @UniqueEntity 注解即可返回符合API规范的格式错误。
内容的提问来源于stack exchange,提问作者Ricardo Martins
相关产品推荐
相关产品推荐

