Laravel中如何使用Spatie填充DTO对象?
修正DTO并填充请求数据的步骤
首先你的DTO定义存在两处错误,需要先修正才能正常使用Spatie Laravel Data的自动映射功能:
1. 修正Rating类
让Rating继承Spatie的Data类,这样Spatie才能识别并映射它的属性:
<?php namespace Domain\Subscriber\DataTransferObjects; use Spatie\LaravelData\Data; class Rating extends Data { public int $rateid; public int $rate; }
2. 修正RateData类
原代码中public Rating $rating = array();存在类型不匹配问题,$rating是数组但声明为单个Rating对象,需要修正类型声明,同时可移除空构造函数,让Spatie自动生成构造逻辑:
<?php namespace Domain\Subscriber\DataTransferObjects; use Spatie\LaravelData\Data; class RateData extends Data { // 声明为Rating对象的数组 public array $rating; // 若使用PHP 8.1+,也可声明为泛型集合 // public \Illuminate\Support\Collection<int, Rating> $rating; }
3. 控制器中填充DTO
在控制器里,直接使用Spatie Data提供的from静态方法,即可自动将请求数据映射到DTO对象:
class RateController extends Controller { public function index(Request $request) { // 从请求数组生成DTO实例 $rateData = RateData::from($request->all()); // 也可直接从Request对象生成 // $rateData = RateData::from($request); // 将DTO传递给服务类使用 $service->setRate($rateData); } }
补充说明
- 若需对请求数据做验证,可在DTO类中定义
public static function rules()方法,Spatie会自动应用验证规则 - 如需自定义数据映射逻辑,可在DTO类中添加
transform方法,或使用mapWithKeys等方法调整数据结构
内容的提问来源于stack exchange,提问作者Temp
相关产品推荐
相关产品推荐

