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