В чем ошибка при составлении классов? Есть сайт, на котором публикуются новости. Новости может создавать как администратор, так и зарегистрированные посетители сайта. Новости хранятся в базе данных в одной таблице 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
209 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир