У меня есть свой собственный PHP MVC-фреймворк для некоторых проектов, над которыми я работаю. Когда я впервые создал фреймворк, это было в контексте построения административной CMS. Следовательно, между моделью, представлением и контроллером были очень хорошие отношения один-к-одному. У вас есть одна строка в БД, которая соответствует одной модели. Контроллер загружает модель и передает ее представлению, которое будет отображено (например, в форму редактирования). Красиво, чисто и просто.
Однако, теперь, когда я работаю над внешним интерфейсом сайта, дела идут не так, как надо. Страница не всегда является представлением одной модели. Это может быть список пользовательских каталогов с 20 пользователями (каждый из которых является моделью пользователя). Кроме того, могут существовать метаданные о запросе, такие как нумерация страниц (текущая страница, общее количество страниц, количество результатов) и / или поисковый запрос.
У меня вопрос: какой самый чистый способ передать все эти данные в представление?
Некоторые варианты, которые я рассматриваю:
Пусть контроллер создаст массив и передаст его представлению в виде одного параметра:
class UserController{
public function renderView(){
// assume there's 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's 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's some logic to create models, get pagination, etc.
$view = new UserView();
$view->collection->add($models,'models');
$view->collection->add($currentPage,'currentPage');
return $view->render();
}
}
Я знаю, что технически любой из мог бы работать, но я не уверен в лучшем выборе, или если есть лучший или более традиционный выбор, который я упускаю.