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

Laravel中DTO使用疑问及变量未定义问题求助

DTO结合原有代码的讲解及变量未定义问题解决

一、DTO与原有代码的结合方式

DTO(数据传输对象)的核心作用是将零散的数组数据封装成结构化对象,统一管理数据访问,避免直接操作数组带来的维护问题。结合你的原有代码,按以下步骤操作:

1. 完善DTO类的定义

首先需要给JobsDTO补充构造方法和对应属性,同时修正getUsers的返回类型(你的原代码返回string,但$data['data']是用户列表,应该是array类型):

class JobsDTO
{
    // 用构造函数属性提升直接定义属性并初始化
    public function __construct(
        private array $users,
        private int $month,
        private int $year,
        private int $workingDays,
        private float $holidayHours,
        private string $advancePayrollDate,
        private string $mainPayrollDate
    ) {}

    // 返回用户列表,类型修正为array
    public function getUsers(): array
    {
        return $this->users;
    }

    // 按需添加其他字段的getter方法
    public function getMonth(): int
    {
        return $this->month;
    }

    public function getYear(): int
    {
        return $this->year;
    }

    // 其他字段的getter同理,比如getWorkingDays()、getHolidayHours()等
}

2. 替换原有数组赋值逻辑

原来直接从$data赋值类属性的方式,改为实例化JobsDTO并将其作为类的属性存储,后续通过DTO的getter方法获取数据:

// 原代码:直接赋值数组字段
// $this->users = $data['data'];
// $this->month = $data['month'];
// $this->year = $data['year'];

// 新代码:实例化DTO并存储为类属性
$this->jobsDTO = new JobsDTO(
    $data['data'],
    $data['month'],
    $data['year'],
    $data['working_days'],
    $data['holiday_hours'],
    $data['advance_payroll_date'],
    $data['main_payroll_date']
);

二、解决"Undefined variable '$jobsDTO'"错误

你遇到的错误是变量作用域问题:$jobsDTO是在__construct方法内定义的局部变量,仅在构造函数内部有效,handle方法无法访问。解决方法是将$jobsDTO转为类的成员属性:

修改后的完整代码示例

class YourJobClass // 替换为你的实际类名
{
    private $jobWatcherId;
    private $jobsDTO; // 定义类属性存储DTO实例

    public function __construct($data, $jobWatcherId)
    {
       $this->jobWatcherId = $jobWatcherId;
       // 将DTO实例赋值给类属性
       $this->jobsDTO = new JobsDTO(
           $data['data'], 
           $data['month'], 
           $data['year'],
           $data['working_days'], 
           $data['holiday_hours'],
           $data['advance_payroll_date'], 
           $data['main_payroll_date']
       );
    }

    public function handle()
    {
        $jobWatcher = JobWatcher::find($this->jobWatcherId);

        try {
            $startedAt = now();

            $jobWatcher->update([
               'status_id' => JobWatcherStatusEnum::PROCESSING,
               'started_at' => $startedAt,
            ]);

            $redmineService = new RedmineAPIService();
            // 通过$this->jobsDTO访问类属性
            foreach ($this->jobsDTO->getUsers() as $user) {
                // 编写你的业务逻辑
            }
        } catch (\Exception $e) {
            // 补充异常处理逻辑,比如更新任务状态为失败
            $jobWatcher->update([
                'status_id' => JobWatcherStatusEnum::FAILED,
                'error_message' => $e->getMessage()
            ]);
        }
    }
}

关键说明

  • 将$jobsDTO从构造函数的局部变量改为类的成员属性,确保在整个类的方法中都能访问。
  • 修正JobsDTO中getUsers的返回类型为array,否则遍历用户列表时会出现类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:45:40