如何在spatie/laravel-data中声明字符串或整数数组属性?
解决spatie/laravel-data中声明原生类型数组属性的问题
你遇到的错误是因为DataCollection和DataCollectionOf注解专门用于处理Spatie Data类实例的集合,而string::class是原生类型,不属于Data对象,因此两者不兼容。以下是两种正确的实现方式:
方式一:直接声明原生数组类型(最简方案)
如果仅需接收字符串/整数数组,无需额外验证逻辑,直接使用array类型即可:
class ExampleData extends Data { public function __construct( public ?string $someProperty, public ?array $countries = null ) {} }
这种写法可以直接解析你提供的JSON请求负载,自动将["en", "de"]映射到$countries属性。
方式二:用ArrayType注解做严格类型验证
如果需要确保数组内的元素都是指定的原生类型(比如必须全为字符串),可以使用ArrayType注解做约束:
use Spatie\LaravelData\Attributes\Validation\ArrayType; class ExampleData extends Data { public function __construct( public ?string $someProperty, // 约束数组元素必须为字符串 #[ArrayType(['string'])] public ?array $countries = null ) {} }
如果是整数数组,只需把['string']替换为['integer']即可。该注解会自动验证输入数组的元素类型,不符合要求时会抛出验证错误。
注意:DataCollection仅适用于存放自定义的Data对象集合,原生类型数组无需使用它,用普通array类型搭配注解就足够满足需求。
内容的提问来源于stack exchange,提问作者user275157
相关产品推荐
相关产品推荐

