问题描述
我正在尝试创建特定类型的数据传输对象的自定义集合。我正在使用“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 (将#修改为@)