Нужно ли создавать класс для объектов?

Всем привет! Вопрос по большей части по MVC... Как правило, везде описывают MVC как Model Controller и View. Но я встречал, что создают дополнительную папку в проекте "Entity", где хранят классы для объектов.
Т.е. например при получении списка постов из базы данных делается что-то вроде:
class Post{
	private $title, $text, $owner_id, $category, $date, $likes, $dislikes; // ........ и т.д.
	
	function __construct($id){ $this->id	= $id;}
	
	function setTitle($title){ $this->title = $title;}
	function setText($text){ $this->text = $text;}
	
	// И так 100500 сетеров и гетеров для установки и получения каждого свойства
}

class ModelPost{
	
	private $list_posts;

	function getPostsFromId($ids){
		
		$res = mysql_query("SELECT * FROM `posts` WHERE `id` IN($ids)");
		while($row = mysql_fetch_assoc($res)){
			
			$post = new Post($id);
			$post->setTitle($row['title']);
			$post->setText($row['text']);
			
			$this->list_posts[$row['id']] = $post;
		}

		return $this->list_posts;
	}
}


Это правильный подход, или я опять что-то не так понял?
  • Вопрос задан
  • 2191 просмотр
Пригласить эксперта
Ответы на вопрос 7
Stalker_RED
@Stalker_RED
Почти все современные реализации MVC довольно далеки от "канонических". Особенно в вэб.

https://habrahabr.ru/post/321050/

UPD: и вообще, вам не кажется, что вы изобретаете собственную реализацию ORM?
Они готовые уже есть. Doctrine, например.
Ответ написан
Комментировать
@egormmm
Борітеся — поборете!
Подход set - get часто используется, но как по мне - это мрак. Если 100 свойств у класса - должно быть 100 get, и 100 set.

В данном случае я бы все свойства post установил бы через конструктор. А доступ и модификацию к ним сделал бы через магические методы.
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
класс Post - нормально
ModelPost - это Repository а не модель
Ответ написан
Вот как я всё это понимаю:
Entity это класс для работы с БД или другим хранилищем данных. Его задача заключается именно в предоставлении удобного интерфейса для работы с этим хранилищем для конкретно этой "структуре данных".

Model это класс, с которым работает весь окружающий код. Он должен быть удобным для работы с этой моделью данных. Его интерфейс никак не зависит от того, как именно хранятся данные и описывает только поведение этой модели. Модель это ведь не только запись/чтение данных, там достаточно много своих задач. А вот для записи/чтения данных внутри Modelи уже происходит работа с Entity. И если вдруг вы решили менять БД с какой-нибудь SQL на noSQL, сделать некоторые правки в работе с БД или т.п., то вы просто изменяете Entity класс, не влезая в логику модели или, упаси Боже, в бизнес-логику.

Проще говоря задача Entity работать с БД, задача Modelи - описывать поведение модели. Для хранения и получения данных в Модели используется Entity.

Что касается правильного подхода: если у вас проект небольшой и вам не нужно городить тонны кода для работы моделей (а-ля блог), то вся эта канитель с Entity пустая трата времени. Если же проект серьёзный, с последующей долгой поддержкой, то такое разделение логики сохранит множество нервов всей команде разработчиков.

И напоследок знаменитая статья дяди Боба о чистой архитектуре
Ответ написан
@synapse_people
Класс можешь для сущности не создавать, массив обычный тоже не плохо
но обязательно сделай отдельно репозитории, т.к. если начнешь использовать транзакции, то при текущем подходе будет плохо
Ответ написан
Комментировать
Тут уже много написано (в т.ч. и в комментариях). Но почему-то никто не упомянул про DDD (Domain Driven Development). "Ноги" эти entity растут как раз оттуда. Если в двух словах, то классы сущностей вам нужны, чтобы абстрагироваться от источника этих самых данных. Эту entity вы можете перетаскивать на любой фреймворк (или вообще на голом PHP) - она не пострадает
Ответ написан
PravdorubMSK
@PravdorubMSK
В данном примере Post - это по факту модель.
А ModelPost - это реализация паттерна DataMapper - прослойка между обьектами и базой.

В любом случае - подход правильный.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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