Задать вопрос

В чем ошибка при составлении классов?

Есть сайт, на котором публикуются новости. Новости может создавать как администратор, так и зарегистрированные посетители сайта. Новости хранятся в базе данных в одной таблице news.
id: integer
type: integer
model_id: integer DEFAULT NULL
image: varchar(255)
content: blob

type — тип новости (1 - новость от администратора, 2 — новость от посетителя сайта).
model_id — ID пользователя, написавшего новость.
На текущем этапе основное отличие новости администратора, от новости пользователя — разные папки для хранения картинок. Картинки для новости администратора сохраняются по пути /images/news/site/, картинки от пользователя сохраняются по пути /images/news/user/user_id.
Я создал класс News — это модель MVC, связанная с БД. Отвечает за основные параметры (id, content);
Дальше создал класс NewsAdmin extends News и NewsUser extends News. Они отвечают за сохранение картинок в нужную папку. Для этого в них реализован метод getPathToImages($image);
Проблема вот в чем.
Необходимо на сайте создать страницу «Новости». На странице должны быть переключатели: «Все новости», «Новости администратора», «Новости от посетителей».
Получить список новостей админа легко: NewsAdmin::find()->all(); Получить путь к папке с картинками легко $model->getPathToImages($model->image);
Аналогично с новостями пользователей.
А вот с общими новостями проблема. Даже если их и вытащить из БД с помощью News::find()->all(), то получить путь к папке уже невозможно, так как в классе News не реализован метод getPathToImages();

В чем ошибка? Не правильно создал таблицу и стоило делать две таблицы? Или не правильно реализовал методы? Как сделать красиво?
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
restyler
@restyler
Если обсуждать "архитектурно правильные" способы разрешения такой ситуации в ООП и в Yii2 в частности - могу сказать, что ваш случай подпадает под кейс single table inheritance - вот отличный пример из мануала как его готовить.

В результате при итерации по массиву News::find()->all() у вас там будут экземпляры не News, а NewsAdmin и NewsUser. Является ли вышеупомянутый паттерн оверинжинирингом в вашей ситуации? Решать только вам :) возможно, проще действительно не париться и захардкодить все в базовом классе.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@serega_kaktus
Программист-самоучка, фрилансер
Можно вынести в конфиг связь type->path, тогда вам не понадобятся классы NewsUser и NewsAdmin. А метод getPathToImages() будет возвращать путь в зависимости от типа.
Можно вынести в конфиг связь type->className, тогда получив имя класса из конфига в коде, можно создать объект $news = new $className($param);
Первый вариант предпочтительнее, если больше нет никаких причин использовать наследование.
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
2 таблицы для данной задачи - это действительно странно
Создай общую в getPathToImages(); передавай параметры:
getPathToImages($image, $user)
и передавай через $user все, админ или юзверь
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы