Ошибка «невозможно использовать объект типа App\DataTransferObjects\TestDTO в качестве массива» в Laravel при работе с кPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Ошибка «невозможно использовать объект типа App\DataTransferObjects\TestDTO в качестве массива» в Laravel при работе с к

Сообщение Anonymous »

Я пытаюсь создать специальную коллекцию объектов передачи данных определенного типа. Я использую пакет "spatie/data-transfer-object".
Вот тестовый класс, который я использую для отладки этой проблемы, которая возникла в течение последних нескольких дней.< /p>

Код: Выделить всё

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: []
}
]
}
Но если я тоже использую метод фильтра:

Код: Выделить всё

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. Я создавал экземпляры своих DTO, используя синтаксис именованных аргументов PHP 8, и это, похоже, работает, поэтому я очень озадачен тем, как это исправить. это или что-то вообще неправильно.

Небольшое обновление
Похоже, когда я не использую собственный класс коллекции, он просто работает как и ожидалось. Например:

Код: Выделить всё

collect($items)
->transform(fn ($item) => new TestDTO(
id: $item['id'],
))
->filter(fn ($item) => isset($item->id));
Тем не менее, если кто-нибудь сможет помочь мне понять, почему это происходит, я буду очень признателен. Сейчас я пойду дальше, но мне ненавистно, по крайней мере, не знать, почему то, что я делал, не работало, особенно если проблема настолько туманна.


Подробнее здесь: https://stackoverflow.com/questions/682 ... rray-in-la
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»