06.07.2012, 03:23
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B~Vladi
|
Наблюдая за другими проектами, мне понравился способ, при котором страница, на которую пришел запрос, сама вытягивает нужные ей данные.
|
за какими именно проектами?
Сообщение от B~Vladi
|
Исходя из этого требования, становится понятно, что первый и третий варианты не подходят - придется дублировать агрегацию данных
для шаблонов и AJAX-запросов. В первом варианте шаблон сам агрегирует нужные ему данные. Во втором этим занимается отдельное приложение. А кто будет это делать для AJAX? Не круто.
|
неочевидно, приведи пример
Сообщение от B~Vladi
|
1. Шаблон напрямую обращается к источникам данных (базе, например).
2. Шаблон дергает некую ручку (приложение), которое обращается к данным, формирует их в нужном формате и возвращает.
3. Приложение (а не шаблон), получает нужные данные из источников и передаёт их одной пачкой в шаблон.
|
т.е. твой объединенный объединенный вариант - 3-ий вариант, который в зависимости от шаблона "получает нужные данные из источников и передаёт их одной пачкой в шаблон"? Так это чистый 3-ий вариант, получаемые данные определяются шаблоном в любом случае.
Сообщение от B~Vladi
|
Эмм, это уже лишнее. Всё-таки окружения разные, значит и код должен быть разным.
|
почему нет? Я слышал такой аргумент в пользу nodejs, собственно вот
Сообщение от B~Vladi
|
Если определение этих наборов переложить на контроллер - он будет сильно разрастаться. Поэтому я и разделил на несколько контроллеров и назвал их сервисы.
|
очень смутно представляю, что и как будет разрастаться...
я думал, ты на сервисы разбил в связи с ограничением количества одновременных запросов на домен. Ну т.е. по инерции, после статики (или они тоже отдельные сервисы?). Вообще создается впечатление, что роутер у тебя будет внешне-внутренним, в результате...
Сообщение от B~Vladi
|
Если такая терминология подходит, предлагаю переходить на неё. Если нет - объясни какие моменты считаешь нелогичными/непонятными.
|
вы какую-то свою терминологию (а может и реализацию) придумываете, вас трудно понимать. Самый распространенный вариант - контоллеры и экшены. Экшены - действия, контроллеры - группы действий. И url часто имеет вид: /[controller[/action[/id]]], например /users/delete/1 или /users
Сообщение от devote
|
Реализация у меня такова, кратко:
1. Шаблон, выступает в качестве client-side/virtual-client-side приложения, никак не связанного c View и ни с чем другим. Собственно он дергает ручки контролера.
2. Контролер, занимается перенаправлением требований от client-side и не более того, то-есть client-side дергает ручку контрола, контрол дергает нужную модель, на основе запроса.
3. модель, собственно занимается формированием данных, обработкой запросов и т.д. Формирует данные и отдает их уже выходному view.
4. View, собственно отвечает за то в каком виде отдать клиентской части данные, в формате JSON ( тоесть по запросу AJAX ) либо уже сформированное view представление.
|
Сообщение от devote
|
Разница в веб приложениях лишь в том, что нет прямой связи клиентской части приложения с серверной. Тоесть клиент получает выдачу того что нарулил сервер, в чем огромное отличие например в обычных приложениях, где есть прямая связь View с контролером без посредников.
|
подожди, ты сравниваешь веб- и десктопные приложения? B~Vladi тебя не об этом спрашивал. И меня этот вопрос тоже интересует (в чем отличие твоей реализации?), потому что я не вкурил её, реализацию...
DjDiablo, я все еще помню, что ты обещал помочь с тестированием разобраться :\
p.s. карма напомнила ситуацию в Зимбабве
Последний раз редактировалось x-yuri, 06.07.2012 в 03:55.
|
|
06.07.2012, 10:10
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от x-yuri
|
за какими именно проектами?
|
Раньше мне попадалось что-то подобное, но сейчас не вспомню конкретно. Сейчас - Яндекс.Маркет, например. Хотя там нельзя сказать, что данные запрашиваются из шаблона, но и не из контроллера или ещё чего-то.
В любом случае это именно тот подход: "страница, на которую пришел запрос, сама вытягивает нужные ей данные."
Сообщение от x-yuri
|
неочевидно, приведи пример
|
В первом примере для генерации страницы агрегированием будет заниматься шаблон. Для AJAX-запросов какой-нибудь сервис/контроллер/как хотите.
Во втором примере вроде бы всё очевидно: для страницы данные формируются в одну пачку, для AJAX-запроса придется писать свой сервис/контроллер/как хотите
Сообщение от x-yuri
|
Так это чистый 3-ий вариант, получаемые данные определяются шаблоном в любом случае.
|
Ну не совсем. В третьем варианте контроллер обращается к источникам, а в объединенном дергаются ручки.
Сообщение от x-yuri
|
очень смутно представляю, что и как будет разрастаться...
|
Реализация получения данных в контроллере будет разрастаться.
Сообщение от x-yuri
|
почему нет?
|
Возможно в каких-то частных случаях - да (либа там какая-нибудь), а так нет. То же XSL-преобразование. API везде разное ==> разный код.
Сообщение от x-yuri
|
я думал, ты на сервисы разбил в связи с ограничением количества одновременных запросов на домен.
|
Не не, всё на один хост/порт уходит с клиента. А статика да, на разные. Но она отдается nginx-ом, так что в контексте разговора нам не интересна.
Сообщение от x-yuri
|
роутер у тебя будет внешне-внутренним, в результате...
|
Ну наверно, не до конца понял это определение. Предлагаешь делать по аналогии с express?
Сообщение от x-yuri
|
И url часто имеет вид: /[controller[/action[/id]]], например /users/delete/1 или /users
|
Ну он таким и будет. Только контроллер определяется до входа в логику. Т.е. запрос приходит напрямую в контроллер, а уже все экшены он разруливает сам.
Вообще, забудьте про "объединенный вариант". Сейчас я склоняюсь к модели, в которой шаблон будет асинхронно дергать ручки и обрабатывать от них ответ. Соответствующий шаблонизатор скоро научится это делать.
Сообщение от x-yuri
|
карма напомнила ситуацию в Зимбабве
|
Кстати, да, даешь инфляцию в интернетах!
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
09.07.2012, 02:24
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B~Vladi
|
Возможно в каких-то частных случаях - да (либа там какая-нибудь), а так нет. То же XSL-преобразование. API везде разное ==> разный код.
|
не вижу проблем в создании двух разных окружений для общего кода. Т.е. в любом случае будет код, который зависит от окружения, и будет не зависящий от окружения код. Насколько это оправдано... практика покажет...
Сообщение от B~Vladi
|
Ну наверно, не до конца понял это определение. Предлагаешь делать по аналогии с express?
|
я имел в виду, что может оказаться, что у тебя роутинг выполняется сначала с помощью nginx, а потом уже самим приложением, т.е. правила будут разбросаны по коду. Вообще все зависит от того, как это будет реализовано...
какие проблемы я вижу?
1) говрят, в процессе рендеринга шаблона, может выясниться, что другой блок надо перерендерить. Мне никаких конкретных примеров в голову не приходит.
Разве что несколько другой вариант, когда блок может потребовать подключить далее по тексту страницы нужные js-файлы или вставить нужный js-код (вариант, когда теги скрипт указаны перед </body>). Но это вроде решаемо.
Т.е. если обобщить: рендеринг блоков может влиять друг на друга, и должна быть возможность это как-то решать
2) как будут исключения/ошибки обрабатываться?
больше ничего не приходит в голову...
Теоретически, должно быть реализуемо и не сложно. Вопрос в том, в чем преимущества активного шаблона и когда его использовать. Возможно, для основного контента страницы больше подходит пассивный шаблон, а для дополнительных (меню, баннеры, и т.д.) - активный...
ну и не надо забывать, что есть POST (действие) и GET (вывод), т.е. не на каждый запрос надо рендерить шаблон.
Последний раз редактировалось x-yuri, 09.07.2012 в 11:04.
|
|
09.07.2012, 12:18
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от x-yuri
|
Но это вроде решаемо.
|
Ну у меня решаемо.
Сообщение от x-yuri
|
как будут исключения/ошибки обрабатываться?
|
На каком уровне?
Сообщение от x-yuri
|
Вопрос в том, в чем преимущества активного шаблона и когда его использовать.
|
Преимущество я вижу в простоте поддержки таких страниц. Ну и данные будут запрашиваться только те, что требуются в конкретной ситуации, ничего лишнего.
Сообщение от x-yuri
|
Возможно, для основного контента страницы больше подходит пассивный шаблон, а для дополнительных (меню, баннеры, и т.д.) - активный...
|
Возможно. Остается найти такой шаблонизатор, который бы позволял рендерить шаблон в обоих режимах.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
10.07.2012, 01:45
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
а вообще, если шаблон будет напрямую обращаться к параметрам запроса, не нравится мне такой вариант. Поэтому гибридный вариант мне кажется оптимальным.
Сообщение от B~Vladi
|
На каком уровне?
|
вот и я о том же. Произошла ошибка при подключении какого-то блока в шаблоне. Как и где обработать эту ошибку?
Сообщение от B~Vladi
|
Ну и данные будут запрашиваться только те, что требуются в конкретной ситуации, ничего лишнего.
|
вообще я думаю, в большинстве случаев сейчас и так используется гибридный вариант, просто это не обязательно поддерживается на уровне шаблонизатора. Класс-вид, соответствующий шаблону, вполне может выполнять активные функции шаблона.
Сообщение от B~Vladi
|
Возможно. Остается найти такой шаблонизатор, который бы позволял рендерить шаблон в обоих режимах.
|
php
Последний раз редактировалось x-yuri, 10.07.2012 в 01:52.
|
|
10.07.2012, 09:33
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
как же я мог забыть об этом шаблонизаторе...
Раз уж речь пошла о шаблонизаторах, стоит говорить на примере какого-то конкретного. Предлагаю TSN, так как он будет использоваться у меня. Ну и в контексте NodeJS.
Сообщение от x-yuri
|
если шаблон будет напрямую обращаться к параметрам запроса, не нравится мне такой вариант
|
Чем?
Сообщение от x-yuri
|
Произошла ошибка при подключении какого-то блока в шаблоне. Как и где обработать эту ошибку?
|
Ну в любом случае это баг, его надо править. Отловить в контроллере это можно, отдав страницу 500 ну и с записью в лог, отправкой e-mail, sms, что угодно
Я считаю надо делать так.
Сообщение от x-yuri
|
Класс-вид, соответствующий шаблону, вполне может выполнять активные функции шаблона.
|
В этом случае при поддержке придется править и код класса и шаблон. Тогда как можно править только шаблон.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
10.07.2012, 10:26
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B~Vladi
|
Чем?
|
слишком много знать будет, шаблон
Сообщение от B~Vladi
|
Ну в любом случае это баг, его надо править. Отловить в контроллере это можно, отдав страницу 500 ну и с записью в лог, отправкой e-mail, sms, что угодно
|
а как насчет обработки ошибки в пределах блока? Т.е. если произошла ошибка при отображении блока, это не привело к тому, что вся страница не отобразилась
Сообщение от B~Vladi
|
Ну и данные будут запрашиваться только те, что требуются в конкретной ситуации, ничего лишнего.
|
кстати, откуда вообще берутся мысли про какие-то лишние данные в случае с пассивным шаблоном?
и расскажи подробнее, как происходит обработка запроса. А то я вот придумал ситуацию, но не знаю, возможно ли такое при твоем подходе: запускается рендеринг шаблона и когда дело доходит до основного контента выясняется, что 404 Not Found. Т.е. весь этот рендеринг выше был ненужным, чего хотелось бы избежать
Сообщение от B~Vladi
|
В этом случае при поддержке придется править и код класса и шаблон. Тогда как можно править только шаблон.
|
ну вот ты сам чуть выше рассказывал, почему ты придумал сервисы... Я не очень вкурил идею с сервисами, но зато с шаблонами вроде бы все очевидно: шаблон определяет как рендерятся данные (пассивная составляющая) и как получаются данные (активная). Для первого больше подходит язык разметки, для второго - язык программирования. Да, если шаблон небольшой - неплохо было бы объединить все в одном файле. Но с другой стороны это может мешать наследованию (шаблонов).
|
|
10.07.2012, 11:34
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от x-yuri
|
слишком много знать будет, шаблон
|
Как бы да, но проблем я тут почему-то не вижу. Можешь привести пример, где это вызвало бы проблемы/неудобства?
Сообщение от x-yuri
|
а как насчет обработки ошибки в пределах блока? Т.е. если произошла ошибка при отображении блока, это не привело к тому, что вся страница не отобразилась
|
Полностью согласен, блок не должен показываться, но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.
Сообщение от x-yuri
|
откуда вообще берутся мысли про какие-то лишние данные в случае с пассивным шаблоном?
|
Очень просто. Для пассивных шаблонов данные максимально соответствуют структуре представления. Если изменится view - нужно будет менять данные. Если будет несколько подобных view - либо для каждого агрегировать отдельный набор данных, либо использовать одни, но при этом может получится так, что для какого-то представления будут передаваться ненужные данные.
Ну и при поддержке нужно будет синхронизировать шаблон с логикой агрегации данных, а это лишний геморрой. Его не будет в активных шаблонах.
Сообщение от x-yuri
|
и расскажи подробнее, как происходит обработка запроса
|
На каком этапе(ах)?
Сообщение от x-yuri
|
А то я вот придумал ситуацию, но не знаю, возможно ли такое при твоем подходе: запускается рендеринг шаблона и когда дело доходит до основного контента выясняется, что 404 Not Found. Т.е. весь этот рендеринг выше был ненужным, чего хотелось бы избежать
|
Эта ситуация решена в примере: сначала рендерится основной контент. Если вдруг в этой части выясняется, что рендерить нечего - не рендерим. Основной шаблон, увидев что контента нет, выдаст содержимое страницы 404 из отдельного шаблона. При этом ничего лишнего отрендерено не будет.
Рядом можно посмотреть на примеры запросов данных, если интересно.
Сообщение от x-yuri
|
Для первого больше подходит язык разметки, для второго - язык программирования.
|
Согласен. У меня получится, что само получение данных инкапсулировано в коде, а из шаблона идет только вызов и обработка ответа. Получается всё на своих местах.
Сообщение от x-yuri
|
Но с другой стороны это может мешать наследованию (шаблонов).
|
Смотря как оно реализовано. Не могу представить такую ситуацию, может потому что у меня нет такого наследования, о котором ты говоришь.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Последний раз редактировалось B~Vladi, 10.07.2012 в 11:41.
|
|
10.07.2012, 22:32
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от B~Vladi
|
но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.
|
Решено.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
11.07.2012, 10:19
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B~Vladi
|
Как бы да, но проблем я тут почему-то не вижу. Можешь привести пример, где это вызвало бы проблемы/неудобства?
|
пример не могу. Просто на мой взгляд, ты переносишь слишком много обязанностей на шаблон, повышаешь связанность. С точки зрения unit-тестирования это скорее всего тоже неудобно.
Сообщение от B~Vladi
|
Полностью согласен, блок не должен показываться, но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.
|
Сообщение от B~Vladi
|
Решено.
|
как?
Сообщение от B~Vladi
|
Очень просто. Для пассивных шаблонов данные максимально соответствуют структуре представления. Если изменится view - нужно будет менять данные. Если будет несколько подобных view - либо для каждого агрегировать отдельный набор данных, либо использовать одни, но при этом может получится так, что для какого-то представления будут передаваться ненужные данные.
Ну и при поддержке нужно будет синхронизировать шаблон с логикой агрегации данных, а это лишний геморрой. Его не будет в активных шаблонах.
|
можно пример?
Сообщение от B~Vladi
|
На каком этапе(ах)?
|
ну например, приходит запрос. Он передается в сервис, а потом в экшн сервиса? Кто запускает рендеринг шаблона, сервис? Или экшен? Есть отличие между обработкой GET- и POST-запросов?
Сообщение от B~Vladi
|
Рядом можно посмотреть на примеры запросов данных, если интересно.
|
вот я и говорю, что ты переносишь часть кода в язык разметки. Т.е. код записывается отчасти с помощью языка разметки. А язык разметки неудобен для написания кода. И это не то же самое, что в php. В php код может быть внутри разметки.
Сообщение от B~Vladi
|
Согласен. У меня получится, что само получение данных инкапсулировано в коде, а из шаблона идет только вызов и обработка ответа. Получается всё на своих местах.
|
с некоторым перекосом в сторону активности шаблона
Сообщение от B~Vladi
|
Смотря как оно реализовано. Не могу представить такую ситуацию, может потому что у меня нет такого наследования, о котором ты говоришь.
|
да, потому что у тебя наследование недекларативное. Декларативность - проще и надежнее (сложнее сделать ошибку), но менее гибка, если это необходимо...
кстати, есть все-таки две вещи, которых немного не хватает в mustache...
Последний раз редактировалось x-yuri, 11.07.2012 в 10:22.
|
|
|
|