使用 DTO 集合时,在 Laravel 中出现错误“无法使用 App\DataTransferObjects\TestDTO 类型的对象作为数组”

问题描述

我正在尝试创建特定类型的数据传输对象的自定义集合。我正在使用“spatie/data-transfer-object”包。

这是我用来调试最近几天出现的问题的测试类。

namespace App\DataTransferObjects;
​
use Illuminate\Support\Collection;
​
class TestDTOCollection extends Collection
{
    public function __construct($items)
    {
        $DTOs = [];
​
        foreach($items as $item) {
            array_push($DTOs,new TestDTO(
                id: $item['id'],));
        }
​
        parent::__construct($DTOs);
    }
}

我在其他地方也这样使用它:

$collection = TestDTOCollection::make($items);

dd($collection);

正如预期的那样,输出是包含 TestDTO 对象的集合的内容

App\DataTransferObjects\TestDTOCollection^ {#942
  #items: array:2 [
    0 => App\DataTransferObjects\TestDTO^ {#962
      +id: "0123456789"
      #exceptKeys: []
      #onlyKeys: []
    }
    1 => App\DataTransferObjects\TestDTO^ {#986
      +id: "000000000"
      #exceptKeys: []
      #onlyKeys: []
    }
  ]
}

但如果我也使用 filter 方法

TestDTOCollection::make($items)
  ->filter(fn ($item) => $item->id === $someId));

它会抛出这个错误

Cannot use object of type App\DataTransferObjects\TestDTO as array
  at app/DataTransferObjects/TestDTOCollection.PHP:15
     11▕                $DTOs = [];
     12▕ 
     13▕                foreach($items as $item) {
     14▕                        array_push($DTOs,new TestDTO(
  ➜  15▕                                id: $item['id'],16▕                        ));
     17▕                }
     18▕ 
     19▕                parent::__construct($DTOs);

使调试变得如此困难的是,我绝对不会尝试在构造函数或其他任何地方使用 TestDTO 对象作为数组,但仍然会弹出此错误 - 更奇怪的是,它指向 TestDTOCollection 构造函数之后集合被实例化没有任何问题。

作为参考,这里是 TestDTO 类:

namespace App\DataTransferObjects;

use Spatie\DataTransferObject\DataTransferObject;

class TestDTO extends DataTransferObject
{
  public string $id;
}

我将 Laravel 8 与 PHP 8 一起使用。我正在使用 PHP 8 的命名参数语法实例化我的 DTO,而且这似乎确实有效,所以我非常困惑如何解决这个问题,或者在第一个中什至有什么问题地点。


小更新

似乎当我不使用自定义集合类时,它会按预期工作。例如:

collect($items)
    ->transform(fn ($item) => new TestDTO(
        id: $item['id'],))
    ->filter(fn ($item) => isset($item->id));

不过,如果有人能够帮助我弄清楚为什么会发生这种情况,我将不胜感激。我现在会继续前进,但我讨厌至少不知道为什么我正在做的事情没有用,尤其是在问题如此模糊的情况下。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...