使用Spatie Laravel-data创建含可选字段的Laravel DTO遇验证问题
问题描述
我正在使用Spatie Laravel-data创建用于API输入输出的数据对象(DTO)。尝试通过POST请求创建DTO时遇到问题:执行INSERT操作时无需传入ID等字段,但每次都会触发验证失败,报错信息如下:
{ "message": "The given data was invalid.", "errors": { "id": [ "The id field is required." ] } }
我的DTO类代码如下:
class MemberData extends Data { public function __construct( public int|Optional $id, #[Max(255)] public string $first_name, #[Max(255)] public string $last_name, ) {} }
请问如何无需传入ID即可通过验证?或者是否应为INSERT操作单独创建DTO?
解决方案
- 修正DTO字段配置:给
id属性添加#[Optional]注解,而不是将类型声明为int|Optional。修改后的代码示例:
class MemberData extends Data { public function __construct( #[Optional] public ?int $id, #[Max(255)] public string $first_name, #[Max(255)] public string $last_name, ) {} }
这样配置后,id字段就会被标记为可选,提交请求时不传该字段也能通过验证。如果要求id存在时必须是整数类型,可保留int类型,搭配#[Optional]和#[Nullable]注解使用。
- 拆分DTO(可选方案):如果创建和更新场景的字段差异明显,可以单独创建两个DTO,比如
CreateMemberData(不含id字段)和UpdateMemberData(包含id字段)。这种方式更贴合单一职责原则,也能避免不同场景下的字段混淆问题。
内容的提问来源于stack exchange,提问作者charliefortune
相关产品推荐
相关产品推荐

