dzheka3d
@dzheka3d

Должен ли контроллер знать о существовании других моделей?

Всем привет! Всё разбираюсь с паттерном MVC... Вопрос, впринципе, в заголовке темы, но напишу подробнее. Может я вообзе все не правильно делаю...
Есть у меня контроллер:

class PostsController{
	private $list_posts; // полученный массив объектов пост
	
	function getUserPosts(){
		if(!isset($_GET['user_id'])) throw new Exception("Нет ID пользователя");
		$PostsModel = new \PostsModel;
		$this->list_posts = $PostsModel->getUserPosts(intval($_GET['user_id']));
		/*
			в свойство list_posts получили массив объектов ПОСТ вида:
			array(
			 3575 => array("post_id" => 3575, "title" => "Test Post"),
			 5592 => array("post_id" => 5592, "title" => "Test Post 2"),
			)
		*/
	}
}


После получения массива объектов пост, перед отправкой данных в $PostsView->render('template', $this->list_posts), нужно добавить к каждому объекту последние 2 комментария так, чтобы результат получился таким (покажу на примере одного объекта, чтобы код был короче):

array(
	3575 => array(
		"post_id" => 3575, 
		"title" => "Test Post", 
		"comments" => array(
			array("author", "text", "date"),
			array("author", "text", "date")
		)
	)
)


Для этого, в методе PostsController->getUserPosts() нужно собрать все ID объектов в массиве и сделать запрос к совершенно "левой" модели CommentsModel->getCommentsFromPostIds();
И после получения результата - раскидать все комментарии по соотвествующим ID постам.

И вот и есть вопрос. Получается, что контроллер PostsController обращается к модели CommentsModel. Правильно ли это? Хотя я подозреваю что не очень.
  • Вопрос задан
  • 315 просмотров
Пригласить эксперта
Ответы на вопрос 3
@BorisKorobkov Куратор тега PHP
Web developer
В общем случае контроллер может знать о моделях.

В вашем случае:
Во-первых, используйте не процедурный подход (а у вас именно так, несмотря на классы), а ООП.
Во-вторых, list_posts лучше не многомерным массивом, а массивом ActiveRecord-моделей Post.
В-третьих, getCommentsFromPostIds() надо вызывать не у левой модели, а getComments() у вышеуказанной модели Post. Причем, это правильнее сделать прямо во View при отображении.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
После получения массива объектов пост
а на самом деле почему-то массив массивов. Что мешало, раз пошла такая пьянка, получить таки объекты, и в них уже положить массив объектов комментов?
Есть такая штука - коллекция, например вот так примерно работает:
$posts = new Collection(new Post()); // передаем пустой объект нужного типа
$posts->createCollectionByOwner($ownerId); // инициализируем - грузим коллекцию по параметру
$posts->appendComments(); // грузим комменты
$posts->appendImages(); // подгружаем картинки
$this->view->posts = $posts; //отдаем коллекцию в вид
echo $this->view->renderView(); // рендерим

и все, внутри все пишется 1 раз, работает для любого типа объекта.
Ответ написан
@egormmm
Борітеся — поборете!
Если посмотреть на MVC "сверху" - то нах она нужна? Правильно! Чтобы можно было логически разделить куски кода, и переиспользовать то, что уже когда-то было написано.

Контроллер - это логика. Это менеджер, который принимает в сервис ваш автомобиль. Это ресепшн-менеджер, который поселяет вас в отель.

Что должен делать такой менеджер? Просто знать , что ему нужно принять документы, дать вам подписать какие-то бумажки и выдать ключи от номера. Все.

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

Обычно другие объекты - это модели (данные) и сервисы (обработка структур данных).

А то что пишут выше - это все личный взгляд людей на MVC. Это то, что они поняли, и их личный опыт.

Ведь какой самый главный враг программиста? Правильно: побороть сложность. Для этого и придумали такое разделение и назвали его MVC.

А вы пишите так, как вы сможете спустя неделю быстро сам понять что там делается. И при необходимости объяснить другим ваше видение архитектуры.
Ответ написан
Ваш ответ на вопрос

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

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