You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:39:27