У меня есть собственный фреймворк PHP MVC, созданный вручную для некоторых проектов, над которыми я работаю. Когда я впервые создал фреймворк, это было в контексте создания административной CMS. Таким образом, между моделью, представлением и контроллером существует очень хорошая однозначная связь. У вас есть одна строка в базе данных, которая соответствует одной модели. Контроллер загружает модель и передает ее в представление для визуализации (например, в форму редактирования). Красиво, чисто и легко.
Однако теперь, когда я работаю над интерфейсом сайта, все становится не так актуально. Страница не всегда является видом одной модели. Это может быть список каталогов пользователей с 20 пользователями (каждая модель User). Кроме того, могут быть метаданные о запросе, такие как разбивка на страницы (текущая страница, общее количество страниц, количество результатов) и / или поисковый запрос.
Мой вопрос: как лучше всего передать все эти данные в представление?
Некоторые варианты я рассматриваю:
Попросите контроллер создать массив и передать его представлению как один параметр:
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(); } }
Я знаю, что технически любой из может работать, но я не уверен в лучшем выборе, или если есть лучший или более традиционный вариант, который мне не хватает.