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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:30:57