А если view содержиT в себе подвью или что-то в этом духе?
Отличный вопрос.
Вот только к передаче данных в шаблон он особого отношения не имеет. С этим-то, как раз, проблем нет. Понято что отдельными переменными будет долго, а массив или объект - в самый раз.
А вот
"Если объект, то допустимо ли, чтобы запрос к базе шел прямо в момент рендеринга?" - это ключевой вопрос современности.
Собственно, это проблема "активные vs. пассивные шаблоны", которая некоторое время назад активно обсуждалась.
Тогда у меня своего мнения не было, а сейчас вот сформировалось.
Подходы можно условно разделить на 4 группы:
- самый эээ... прямолинейный: "юзай ob_* функции". Т.е. ответ - "да, можно обращаться к базе, когда уже идет рендеринг".
- самый хитро... умный - SSI: если вдуматься, то пост-парсинг сгенерированного ХТМЛ-а решает нам кучу проблем. Естественно, такой парсинг ударяет по производительности (ведь нжинкс, веместо того, чтобы просто отдать страницу, должен сначала разобрать ее по буковке и найти инструкции SSI, сделать подзапросы к модулям и собрать из ответов готовую страницу), но, говорят, падение совсем незначительное. Зато какой профит! Проблема в одном из блоков не ложит нам весь сайт, получается истинно блочная структура, скорость генерации основной страницы уменьшается.
- самый очевидный: блочные шаблоны. прямое следствие п.2., по аналогии с которым вспоминаем "не-РНР шаблоны". Ведь перед ними такая проблема вообще не стоит - у них парсинг не объединен с выводом, как в пхп. Сначала идет предварительный парсинг шаблона, а потом только его вывод. На этапе парсинга не проблема найти включение блоков, отпарсить их тоже, а потом только начинать вывод.
- самый, на мой взгляд, православный, но и самый муторный - в основном контроллере страницы поочередно вызываются все контроллеры блоков, отдают свои сгенерированные хтмл-и, и их содержимое вставляется в основной шаблон. Здесь проблема в том, что каждый блок приходится дублировать два раза - один раз упоминая его в шаблоне. а второй - вызывая его в контроллере. Во всех остальных случаях достаточно блок обозначить только в шаблоне.
На мой вкус - это не такая уж и беда. В конце концов, все остальные данные мы тоже по два раза прописываем, сначала получение в контроллере, а потом вывод в шаблоне.