У меня есть собственная ручная фреймворк PHP MVC для некоторых проектов, над которыми я работаю. Когда я впервые создал фреймворк, это было в контексте создания админ-CMS. Поэтому между моделью, представлением и контроллером была очень приятная взаимно-однозначная взаимосвязь. У вас есть одна строка в БД, которая сопоставляется с одной моделью. Контроллер загружает модель и передает ее в визуализируемое представление (например, в форму редактирования). Хороший, чистый и легкий.
Однако теперь, когда я работаю над интерфейсом сайта, все становится липким. Страница не всегда представляет собой представление об одной модели. Это может быть список каталогов пользователей с 20 пользователями (каждая из моделей пользователей). Кроме того, могут быть метаданные о запросе, такие как разбиение на страницы (текущая страница, общие страницы, количество результатов) и/или поисковый запрос.
Мой вопрос: какой самый чистый способ передать все эти данные в представление?
Некоторые параметры, которые я рассматриваю:
-
Попросите контроллер создать массив и передать его в виде одного параметра:
class UserController{ public function renderView(){ // assume there some logic to create models, get pagination, etc. $data = array() $data['models'] = $models; $data['currentPage'] = $current; $data['totalPages'] = $total; return $view->render($data); } } class UserView{ public function render($data){ // render the data } }
-
Создайте свойства в классе представления и запишите их в контроллер:
class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ // assume there some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } }
-
Дайте представлению какой-то общий объект HashMap или Collection как контейнер, который может содержать произвольное число и имя данных.
class UserView{ public $collection = new Collection(); // works like a Java collection } class UserController{ public function renderView(){ // assume there some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } }
Я знаю, что технически любой из них мог бы работать, но я не уверен в лучшем выборе, или если есть лучший или более обычный выбор, который мне не хватает.