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

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

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

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

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

PS: эта тема отделена от предыдущей, и они не связны.
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ответы на вопрос 3
serginhold
@serginhold
наследовался, переопределил offsetSet(), сделал в нем проверку, в чем вопрос то?
Ответ написан
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Дженериков в пыхе нету (и пока что даже rfc не рассматривается), поэтому нормально - никак.

Более того, вы даже отнаследоватся и поставить там strict-type аргументы не сможете, в виду инвариативности типов аргументов и возвращаемых значений.

Лучшее решение - забить и ничего не делать. В ПХП оно того не стоит.
Ответ написан
@2vtlk
А в чем проблема сделать кастомную коллекцию и потом переопределить её конструктор который будет валидировать входящие модели?

Код из документации:
<?php

namespace App;

use App\CustomCollection;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Create a new Eloquent Collection instance.
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы