Laravel — как типизировать Illuminate\Support\Collection?

159
20 июля 2021, 09:50

Мне нужно, чтобы мой метод возвращал коллекцию, но коллекция должна иметь только бъекты заданного типа, например, ProductItem

Как это можно реализовать?

Т.е. мне нужно на основе класса Illuminate\Support\Collection получить свой класс, ProductItemCollection, в который можно будет класть только объекты типа ProductItem.

Как это можно реализовать? какие есть варианты? Каким образом можно будет задавать тип для моего контейнера?

Answer 1

Тут стоит подумать, действительно ли Вам нужна функциональность, предоставляемая классом Illuminate\Support\Collection?

Пересмотрел описание коллекций. Перечитал документацию по коллекциям. Даже исходники посмотрел. И у меня нет простого ответа на Ваш вопрос.

Сдается мне, что с такими запросами Вам надо смотреть не на Eloquent, а в сторону Doctrine. По крайней мере, там есть документированная возможность расширения класса коллекций:

Вы можете создавать собственные классы коллекций, расширяя класс Doctrine\Common\Collections\ArrayCollection. Если семантика __construct отличается от стандартной коллекции ArrayCollection, вы можете переопределить метод createFrom

Нет, конечно же на основе Illuminate\Support\Collection сделать то, что Вам надо, возможно. Я в этом абсолютно уверен. Не уверен только в целесообразности затраты усилий на такую реализацию. Поскольку это потребует не только расширять класс Collection, но и "вписывать" его в "среду обитания". Т.е. делать поставщика услуг, который будет регистрировать новые коллекции, возможно - прописывать для них фасады и т.д.

Если же вопрос только в том, что в некоем контейнере могут быть элементы только одного класса, и особенно если этот контейнер отдаете Вы и он должен быть доступен только для чтения (чтобы лишнего, пользуясь "неразборчивостью" PHP, пользователи контейнера сами не насовали), то мне кажется стоит посмотреть в сторону более простого решения с ограничением доступа "только для чтения", реализовав в собственном классе-коллекции интерфейсы Countable и IteratorAggregate.

READ ALSO
Как работают групповые роуты в Laravel?

Как работают групповые роуты в Laravel?

Интересует методика обработки групповых роутов в Laravel:

279
Как обернуть все значки ActionColumn в обертку?

Как обернуть все значки ActionColumn в обертку?

У GridView есть ActionColumn в котором рисуются значки и ссылкиМне нужно, чтобы все ссылки были обёрнуты в div с каким нибудь классом

205
Как отсортировать такой массив?

Как отсортировать такой массив?

Привет есть массив данных, который содержит объектыМассив категории

187
Ajax не срабатывает событие success

Ajax не срабатывает событие success

Есть такой вот код:

280