@tester_toster

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

В бд есть таблица.
Каждая строка таблицы может быть определенной сущностью, пример: "новость, статья, новинка" и.т.д.
Они имеют, как одинаковые параметры, так и разные, например: заголовок и ссылка, есть у всех, рейтинг есть только у новинки.
Для реализации геттеров этих параметров создал абстрактный класс, в нем-же определил конструктор:
abstract class Base
{
    protected $data;

    private $categoryIds;

    public function __construct(array $params)
    {
        $this->data = new NullObject($params);
    }

   public function getTitle() :string
   {
      return $this->data->title;
   }
   
   //...
}

Есть фабрика, которая по определенным критериям данных создает объект нового класса (News, Article) и.т.д.
В конструктор поступает массив данных, который помещается в null объект, а методы уже дергают из него данные. Расписывать конструктор - неудобно, бывает поступает массив содержащий больше 10 элементов.
Также методы некоторых сущностей пересекаются и чтобы не писать несколько раз подряд - просто наследую сущность не от Post, а от сущности имеющий реализации этих методов. Но при этом наследуются и методы, которые мне не нужно.
Что лучше сделать: добавить примеси, либо занулить реализации в дочернем классе, либо еще что-то?

Плюс иногда нужно выбирать коллекцию объектов - для вывода списка, все данные там не нужны, и поэтому я просто подаю туда массив с меньшим количеством данных. В принципе меня все устраивает. Но получается если кто-то захочет вызвать метод использующий данные, которые не пришли в конструктор объекта - получит ошибку. Не охото создавать еще один объект вида ShortNews, т.к в разных местах нужно выбирать разные данные - наплодится много объектов + лишняя логика при построении.
Буду благодарен за любые размышления.
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
Minifets
@Minifets
Hello world!!!
То что вы делаете, такая реализация есть в Doctrine. Можете посмотреть как там это реализованно.
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
Без описания самих параметров сложно осознать разницу между сущностями, вообще правильность Вашего решения и дать более менее адекватные комментарии. Единственное что могу предположить, исходя из Вашего описания, так это то что Вы не правильно построили иерархию наследования. Если бы она была правильной подобных вопросов не возникало бы. Поэтому Вам стоит ее пересмотреть и заново обдумать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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