如何在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
相关产品推荐
相关产品推荐

