Архитектура, где отображение - главное. Имеет смысл?

QQQ

Новичок
Архитектура, где отображение - главное. Имеет смысл?

Думаю идея не нова, но я нигде не видел развёрнутого описания данной архитектуры.

Рассуждения мои чисто теоритические, я не занимаюсь реализацией подобного, просто идея показалась мне интересной, хочется поделиться ей и выслушать другие мнения на этот счёт.

Как происходит работа классического MVC веб приложения? (рассматривать всё буду упрощённо)

1) Парсинг http запроса, на основании которого происходит вызов нужного модуля/конструктора
2) Отработка конструктора изменение/извлечение данных
3) Подстановка данных в шаблон и вывод

Я думаю не секрет, что большинство html страниц можно разделить на блоки, генерация которых происходит на основе данных, которые мало связанны между собой. Часто даже используется SSI, для отображения в целой странице различных блоков.



Что, если пойти от обратного?

Имеем шаблон отображения, что-то типа (названия функций и т.д. тупо схематично для примера):

Код:
<html>
<head>
	<title><?=$this->set_title($this->title)?></title>
</head>
<body>

	<?=$this->render('header.tpl')?>

	<div id="menu"><?=$this->render('menu.tpl', App::call_controller('main_menu'))?></div>

	<div id="left_column">
		<?=$this->render('sub_menu.tpl', App::call_controller('sub_menu'))?>
		<?=$this->render('adware.tpl', App::call_controller('adware'))?>
	</div>

	<div id="content">
		<?=$this->render('content.tpl', App::call_controller($this->page_controller))?>
	</div>
	

	<?=$this->render('footer.tpl')?>
</body>
</html>

1) На основании http запроса определяем layout отображения + необходимые ему данные
2) Рендерим шаблон, попутно вызывая контроллеры необходимых блоков

То-есть из примера 1 (классического MVC) пункты 2 и 3 делаем за один, причём начиная с 3го?

ps: При обновление данных вызывается сразу нужный контроллер, минуя layout. Всё равно при обновлении ничего не должно отдаваться, кроме как json/xml или редиректа Header('Location: ...)


pps: для не html отображений (json например) использовать следующие шаблоны:

Код:
$Return->title   = $this->set_title($this->title);
$Return->menu    = App::call_controller('menu');
$Return->content = App::call_controller($this->page_controller);

Хотелось бы послушать мнения на данный счёт :)
 

Adelf

Administrator
Команда форума
Я однажды попал на проект с такой архитектурой.

Там все как раз страдает из-за того, что части страницы все-таки связаны. Титул страницы генерится на основании работы какого-то контроллера(например название статьи туда надо вписывать). Хлебные крошки если делать - опять-таки проблема: как их генерить, если они зависят от еще одного контроллера(приходится давать модулю хлебных крошек указатель на нужный контроллер, и убеждаться, чтобы это все отработало после того, как отработал главный контроллер).
Как итог, все равно у каждой страницы есть главный контроллер, от которого все зависит, поэтому даже в такой модели главное - это контроллер а не представление. И лучше перейти опять в MVC, а то слишком много мучений :)

З.Ы. Не понял данный код: <title><?=$this->set_title($this->title)?></title>
 

QQQ

Новичок
Там все как раз страдает из-за того, что части страницы все-таки связаны
Это тоже первый аргумент против, который мне пришёл на ум.

<title><?=$this->set_title($this->title)?></title>
Ну вроде типа где-то в "роутере", в зависимости от запроса, кроме шаблона - устанавливаются некоторые первоначальные параметры. Например page_controller и title (взят просто для примера). А set_title - это типа хэлпер шаблонизатора :)

все равно у каждой страницы есть главный контроллер
Знаю, что частный случай, но всё-же. Представим заглавную страницу сайта, которая состоит из шапки и меню, а в области контента там 10 блоков краткой информации со страниц сайта, генерируемых разными контроллерами :) Например последняя новость, самый популярный товар в шопе, самая популярная тема форума и т.д.


UPDATE:

Титул страницы генерится на основании работы какого-то контроллера(например название статьи туда надо вписывать)
да, в реальной жизни при таком подходе как минимум второй проход понадобится


а если не из шаблона фтыкать, а иметь где-то список подключаемых контроллеров в порядке их подключения? То-есть мысль о модульности и равноправии в создании информационных блоков.. Но равноправия без исключения возможности взаимодействия..
 

newARTix

Новичок
Думаю что лучше всего это как раз смешение MVC и данного подхода (шаблон в роли контроллера).
По сути MVC не мешает в шаблоне вызвать хелпер, который дернет модель и покажет нужные шаблону данные. И основной контроллер не будет об этом знать.
Иногда это позволяет намного проще и быстрее решить задачу. Например когда в шаблоне используемом десятком контроллеров нужно вывести меню. Иначе, пришлось бы в каждом из этих десяти контроллеров писать подгрузку этого меню.
Полностью переносить функции контроллера на View опять же не реально. Так что ищем золотую середину и не забываем про прозрачность архитектуры.
 

tz-lom

Продвинутый новичок
Для такой архитектуры требуется хороший шаблонизатор,позволяющий не только вставлять блоки,но и "заворачивать" текущий вывод в элемент шаблона

проблема связанных блоков решается единой моделью для блоков

такое я даже отвелосипедил,можете глянуть здесь (заранее извиняюсь за УГ а не сайт,внезапный завал по работе сожрал всё время посвящяемое сайту)
http://atedgeof.net/Classes/TemplateWrapper/
там немного сыроватый код,если захотите вышлю более свежий
 

Духовность™

Продвинутый новичок
Думаю идея не нова, но я нигде не видел развёрнутого описания данной архитектуры.
это подход называется активные шаблны. реализован, по совам zermksa в его mzz.ru


я не занимаюсь реализацией подобного
я пробовал заниматься реализацией подобного. основной тупик, который мне показался - это то, что описал Adelf. Т.е. я банально не смог в модуль title засунуть имя открываемой статьи, ибо с виду независимые модули title и article требовали взаимосвязи.

MVC лучше.

Иногда это позволяет намного проще и быстрее решить задачу. Например когда в шаблоне используемом десятком контроллеров нужно вывести меню. Иначе, пришлось бы в каждом из этих десяти контроллеров писать подгрузку этого меню.
первое. шаблон не может использоваться "десятком контроллеров", это звездец, а не архитектура.
Второе. Подгрузка меню в каждом контроллере - это пара строк кода. Это НОРМАЛЬНО, если вы действительно реализовали MVC, с хорошей инкапсуляцией логики меню, а не написали ТТУК, в которых дублируете логику этого меню.
 

MiksIr

miksir@home:~$
Знаю, что частный случай, но всё-же. Представим заглавную страницу сайта, которая состоит из шапки и меню, а в области контента там 10 блоков краткой информации со страниц сайта, генерируемых разными контроллерами :) Например последняя новость, самый популярный товар в шопе, самая популярная тема форума и т.д.
Одним контроллером, который готовит данные из разных моделей.
 

A1x

Новичок
я пробовал заниматься реализацией подобного. основной тупик, который мне показался - это то, что описал Adelf. Т.е. я банально не смог в модуль title засунуть имя открываемой статьи, ибо с виду независимые модули title и article требовали взаимосвязи.
строить View по паттерну Composite (так сделано напр. в Magento)
можно тогда выделить два шага
1. построение структуры View из блоков (блоки могут быть вложенными)
2. вывод

на первом шаге каждый блок имеет доступ к любому другому блоку по имени или по иерархии View - т.е. из активного блока, который выводит статью легко можно поменять заголовок страницы, breadcrumbs, добавить в head файлы js/css, etc.
 

MiksIr

miksir@home:~$
Например когда в шаблоне используемом десятком контроллеров нужно вывести меню. Иначе, пришлось бы в каждом из этих десяти контроллеров писать подгрузку этого меню.
Есть и другие способы. Например, цепочка фильтров. Данные для меню подготавливаются в одном месте - фильтре меню.

-~{}~ 19.08.10 14:45:

PS: но в общем активные шаблоны не нравятся по причине плохой читаемости результата, хотя какое-то время идея эта увлекала наши умы ;)
 

newARTix

Новичок
triumvirat
именно поэтому (логика раскидывается по файлам) данный подход я почти не использую. Пример я конечно утрировал. За всё время было всего раз. Но мне кажется, если архитектура фрэймворка например, позволяет _при необходимости_ сделать такой финт ушами (например, для чего-то временного, чтобы показать заказчику или в экстренных случаях), то это ей в плюс.
К слову шаблонизатор Zend_View, например, позволяет :)
 

HraKK

Мудак
Команда форума
Это называется активный шаблон, если я правильно понял. В последний год-полтора его юзаю и круче ничего не нашел, если с умом подходить конечно.
 

QQQ

Новичок
Спасибо всем за обсуждение.

HraKK
а можно примеры реального кода глянуть?
 

Crys

Двинутый новичок
HraKK
Поддерживаю QQQ. Можно пример и, если возможно, ссылки на описание понятия "активный шаблон"?
 

Crys

Двинутый новичок
http://dklab.ru/chicken/nablas/16.html (Четвертый способ)
Читал... лет шесть назад. Тогда это было красиво. А если смотреть сейчас, то этот способ так же схож с примером шаблона данного топика, как клоп и пингвин (то есть, никак)

-~{}~ 20.08.10 02:37:

Нет.. ошибся я. Очень даже похоже. Но(!)

1) На основании http запроса определяем layout отображения + необходимые ему данные
А разве этот участок и не является контроллером?

2) Рендерим шаблон, попутно вызывая контроллеры необходимых блоков
View

Брр... запутался, но не вижу ничего нового. Все стандартно, по-моему.

-~{}~ 20.08.10 02:40:

Возможно, имеется ввиду, что из шаблонов делается вызов "контроллеров", которые в классическом MVC являются виджетами/плагинами/какие_еще_слова_там ?

Дык это те же яйца, только сбоку. Или нет?
 

Crys

Двинутый новичок
triumvirat
не молчи, а скажи... а то мне завтра на работу скоро, дык может что умное смогу сказать... премию может дадут :)
 

С.

Продвинутый новичок
Я исхожу из простого практичного принципа: ничего в системе не должно повторяться. Объявлять где-то список подключаемых модулей/гаджетов, а потом указывать, куда их вставлять -- по-моему чушь. Если я один раз указал где-то, что тут у меня будут "Новости", то система должна сама по этому определить, что вызывать и куда вставлять. В этом смысле активные шаблоны подходят идеально.

Тот же принцип работает для обработки форм и т.п. Если у меня ассортимент полей описан в разных местах системы и его надо поддерживать в соответствии, то я делаю что-то неправильно. То есть напрашивается, что логичнее всего задать в шаблоне, расположение поля и какие значение оно может принимать. И мне наплевать какой это тип валидации и как соответствует MVC.

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

Alexandre

PHPПенсионер
чтоб повысить производительность хочу уйти от МВС в том виде как она есть перейдя на блоки ssi
связанность блоков решается путем обычного кеширования данных (именно данных) через мемкеш или shmop. Код пока в стадии наработок (на гитхабе), кому интересно - в личку. Предыдущий проект показал скорость отработки скрипта (без акселератора) 23 мс
Для примера - ZF скорость отработки скрипта 83мс
 
Сверху