Изменения

Перейти к: навигация, поиск

Sway Solstice

137 байтов добавлено, 13:36, 23 августа 2009
Нет описания правки
Sway Solstice - Solstice — название Новой Платформы для веб-приложений, выросшей из [[Vitaphoto]].
== Цель ==
* Модули, модули, модули, и ничего, кроме модулей. Никаких жёстких завязок на соединение с БД или разбор URL в самом Sway.
* Конфигурация приложения представляет собой вложенный хеш, хранимый просто в виде Perl-кода. Система загрузки конфигурации позволяет объединять несколько файлов для поддержки стандартных конфигураций.
* Каждый модуль в рамках одного веб-приложения создаётся в одном экземпляре. Модули создаются по требованию - требованию — при первом обращении. Межмодульное взаимодействие тривиально - тривиально — <code>$www->name</code> через AUTOLOAD даёт экземпляр модуля name. Если модуль name захочет, он даже сможет переопределить то, что возвращается AUTOLOAD с его именем - именем — это удобно для модулей, в которых только 1 функция.* Использование [[Filter::AutoImport]], чтобы не писать в начале каждой функции длинные серии объявлений переменных <code>$self->www->config</code> и ти т.п п.* Нет никаких RenderRec (в прошлой версии "запрос"«запрос»), и уж конечно он не является точкой сбора огромного числа функциональности.* Нет виртхостов, нет пресловутого "config«config=?" - » — идея нескольких виртхостов в одной базе себя не оправдала.
* Нет завязки на вызов метода render() у модулей, то есть методы обработки можно создавать любые по желанию.
* Нет жёстких завязок на последовательности выполнения (например сначала этот модуль, потом этот, потом тот), а есть функции модулей - модулей — вызывай, как хочешь.* Нет хеша $t имён таблиц, сопоставляющего «реальные» таблицы «виртуальным», задуманного на случай сожительства двух приложений в одной БД ($config->{t}) -  — идея ущербная.
* Нет завязки на регулярные выражения в разборе URI, а точнее, нет вообще никакой завязки в разборе URI, как и самого стандартного разбора URI, кроме «страница?параметры».
* Обёрнутые в функции обращения к БД из модулей. Живут они в Sway::db::, а рядом с ними лежат SQL дампы нужных таблиц.
* Новая версия [[Шаблонизатор VMX::Template|Шаблонизатора VMX::Template]] -  — упрощённая, аккуратная, почищенная, ещё более быстрая.*: Шаблонизатор специально сделан максимально простым, дабы избежать анти-паттернов разработки, к которым подталкивает {{CPAN|Template::Toolkit}}, а именно, к перемещению 50 50 % логики приложения в шаблоны. Примеры того, где так происходит — [http://www.bugzilla.org/ Bugzilla], [http://www.vsem.ru/ Vsem.ru].
*: [[VMX-Template]] создан когда-то по мотивам шаблонизатора phpBB2, самого созданного по мотивам шаблонизатора [http://sourceforge.net/projects/phplib/ phplib], о чём напоминает его синтаксис. Умеет он буквально 5 вещей: циклы, IF’ы, INCLUDE (включение другого шаблона), подстановки выражений в код, присваивания. Данные в шаблон передаются просто Perl-хешем, без промежуточных уровней вроде <code>assign_vars()</code> и <code>assign_block_vars()</code> (phpBB2), {{CPAN|Template::Stash}} (TT). Код шаблонакомпилируется сначала в Perl-код и кэшируется на диске, а потом компилируется интерпретатором и кэшируется в памяти.
* Поддержка [[Funq]]. Штука получилась интересная, хотя и не факт, что распространится.
Примеры:
* Диспетчер URI, сопоставляющий ссылки страницам - страницам — отдельный модуль, который, увы, пишется отдельно, хотя есть стандартные.* БД и кэш - кэш — тоже отдельные модули. Хочешь - Хочешь — используй, хочешь - хочешь — нет. Хочешь - Хочешь — пиши свои.* Например каждый метод авторизации - авторизации — функция модуля auth.
* Например, нет функции вывода в шаблон треда комментариев, а есть функция, возвращающая его в виде хеша, передавай в шаблон, как хочешь.
* Скрытые форумы, привязка сообщений к разделам сайта;
А лучше - лучше — никакая, а просто взять готовый форумный движок.
=== Как быть с генерацией и разбором URI? ===
Общая идеология веб-приложения, на самом деле, весьма нетривиальная штука.
Должна присутствовать возможность реализации различных диспетчеров URI, т.е. то есть разных методов разбора. Например, наиболее простой - простой — /компонент/?key=value&key=value. Другой пример - пример — когда у каждого документа есть фиксированный URI, вообще никак не связанный с его ID и ти т.п п., а связанный только с названием и моментом создания, "как «как завещал великий W3C"W3C».
А разные методы разбора провоцируют разные методы генерации.
А кроме того, не хочется иметь "единых" «единых» функций диспетчеризации, т.е. то есть не хочется, чтобы всё нужно было прописывать явно в одно место.
А кроме того, все модули создаются по требованию, поэтому "заранее" «заранее» выставлять настройки своих стандартных URI не могут.
На входе мы имеем некоторый **адрес страницы**, то есть практически набор неких параметров.
На выходе мы имеем саму страницу. В рамках нашей идеологии она составляется из готовых блоков, предоставляемых компонентами.
''Проблемы'' начинаются, когда мы хотим сослаться из компонента на какую-то другую страницу... страницу… Простейший пример: к стандартному компоненту - компоненту — отображалке списка тем форума - форума — прицепляется сбоку какой-то переключатель. Получается что у списка тем есть контекст - контекст — как минимум номер текущей страницы, и у переключателя есть свой контекст! Переключатель должен как-то сослаться на текущую страницу, в которой изменён его контекст. КАК???
Фактически должно существовать некое "обратное преобразование" «обратное преобразование» для каждого компонента, позволяющее компоненту получить тот адрес, по которому появится нужная функциональность. КАК???
Можно просто забить и отдать URI на откуп шаблонам. Но что, если в дальнейшем понадобится изменить общую схему их генерации? Проблема.
Можно делать как и раньше - раньше — дёргать из кода функцию uri("ТИП"«ТИП», {параметры}). Но что, если в дальнейшем понадобится использовать разные типы в вызовах одного компонента? Тоже проблема.
Однако ближе к "телу" «телу» лежит всё-таки идея генерации URI из шаблонов, т.к. так как именно шаблоны действительно ЗНАЮТ, какой тип страницы собой представляют.
'''Посему вывод: генерацию URI оставляем в шаблонах, но через специальную функцию, которая может осуществлять маппинг URI.'''
Но тут возникает новая проблема! Что делать с различными редиректами из кода? Ссылки нужны, а шаблонов-то нет - нет — ЧТО ДЕЛАТЬ???
С редиректами из кода ещё можно побороться - побороться — от них можно отказаться :) оставив только для специальных случаев, вроде редиректов на безопасные УРЛы и ти т.п. Т.е п. То есть в случае "чего" «чего» компонент чтобы не редирект давал, а некие данные в хеше результата возвращал. Это, в целом, даже идеологически неплохо.
И ещё один кейс - кейс — это к примеру JSON-ответы: "нормальных" «нормальных» шаблонов нет, URI нужны. ЧТО ДЕЛАТЬ??? Можно конечно на этот случай как раз оставить дёрганье фиксированного uri(ЧЕГО_ТО).
===== Как быть с хешем переименований таблиц $t ? =====
Вероятно, его нужно ликвидировать, т.к. так как в большинстве случаев он бессмыслен...бессмыслен…
С другой стороны, а если произойдёт та ситуация, ради которой он задуман - задуман — допустим будем ставиться в одну базу с чем-нибудь другим и будут конфликты имён таблиц?
Может быть, использовать Funq?
Кстати, для полной абстракции от БД нужно все вызовы SQL оборачивать в функции.
**Вывод: хеш $t ликвидировать в задницу, в библиотечных модулях все вызовы к БД оборачивать в функции**
[[Категория:Разработка]]
[[Категория:Sway]]

Навигация