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

如何在Laravel的Spatie LaravelData DTO中正确定义可选属性?

正确定义Spatie Laravel Data可选属性的方式

你遇到的问题核心是:仅将参数类型声明为string|Optional并不足以让PHP把它识别为可选参数,必须同时为参数设置默认值为Optional::create()。

修改后的DTO代码如下:

<?php
namespace App\Http\DataTransferObjects\Listing;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Optional;

class ListingDTO extends Data
{
    public function __construct(
        public string $type,
        public string|Optional $user_id = Optional::create()
    ) {
    }
}

关键说明

  • Optional::create()作为默认值,会告诉Laravel Data:当该参数未提供时,将其标记为「可选缺失」的状态,而不是要求必须传入参数。
  • 这样修改后,无论你是直接通过构造函数实例化(new ListingDTO('post')),还是通过from()/fromRequest()等方法创建DTO实例,只要不传user_id参数,都不会再抛出ArgumentCountError异常。
  • 如果需要允许user_id为null,可以将类型声明改为string|null|Optional,同时保持默认值不变。

内容的提问来源于stack exchange,提问作者Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:04