В чем ошибка при составлении классов? Есть сайт, на котором публикуются новости. Новости может создавать как администратор, так и зарегистрированные посетители сайта. Новости хранятся в базе данных в одной таблице 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();
В чем ошибка? Не правильно создал таблицу и стоило делать две таблицы? Или не правильно реализовал методы? Как сделать красиво?

21 Авг 2019 в 07:07
189 +1
0
Ответы
1

Ошибкой здесь является неправильное использование наследования классов. В данном случае, вместо того чтобы создавать отдельные классы NewsAdmin и NewsUser, которые наследуются от класса News, правильнее было бы использовать композицию или интерфейсы.

Предлагаю вам создать интерфейс, например, ImageInterface, который будет содержать метод getPathToImages(). Затем реализовать этот интерфейс в классах NewsAdmin и NewsUser. Таким образом, каждый класс будет обязан реализовать метод getPathToImages(), что позволит в будущем получать путь к папке с картинками для любой новости.

Примерно так:

interface ImageInterface {
public function getPathToImages($image);
}
class News implements ImageInterface {
// реализация основного класса новостей
public function getPathToImages($image) {
// реализация метода для общих новостей
return '/images/news/';
}
}
class NewsAdmin implements ImageInterface {
// реализация класса для новостей администратора
public function getPathToImages($image) {
// реализация метода для новостей администратора
return '/images/news/site/';
}
}
class NewsUser implements ImageInterface {
// реализация класса для новостей пользователя
public function getPathToImages($image) {
// реализация метода для новостей пользователя
return '/images/news/user/' . $this->model_id;
}
}
// Пример использования
$newsAdmin = new NewsAdmin();
$newsUser = new NewsUser();
$news = new News();
$pathAdmin = $newsAdmin->getPathToImages('image.jpg'); // '/images/news/site/'
$pathUser = $newsUser->getPathToImages('image.jpg'); // '/images/news/user/user_id'
$pathNews = $news->getPathToImages('image.jpg'); // '/images/news/'

Таким образом, вы сможете получить путь к папке с картинками для любой новости, независимо от типа, используя интерфейс и реализацию метода в каждом классе.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир