4LF
Новичок
Framework, общие идеи. Прошу совета
Сначала приведу схему работы, затем описание.
Описание:
qRequest — содержит в себе всю информацию о пришедшем запросе (REQUEST_URI, _GET, _POST, ...)
qRequestManager — менеджер всех пришедших запросов. Содержит стек всех запросов и активный запрос, который обрабатывается в данный момент
qResponseManager — менеджер ответов, для каждого пришедшего запроса создает объет qResponse, так же составляется стек ответов и имеется активный ответ
qResponse — ответ на активный запрос. Данный объект содержит всю информацию, которую будут отдавать пользовательские методы в ходе своей работы, а так же служебная инфа будет присутствовать от системных модулей
qController — думаю без комментариев
qRouter — парсит пришедший REQUEST_URI, выделяет так называемый path, action и все переменные. Переменные могут быть нескольких типов: path-args (те что заданы например таким образом: /company/news/id:10), get-args - обычный _GET.
Так же qRouter определяет по path какой модуль необходимо запустить, если нет такого path на сайте, то соответственно модуль будет 404
qModLoader — загружает конфу модуля. Конфа модуля содержит список возможных действий. Отмечено действие по умолчанию (для случая когда что-то некорректно указано или просто не указан action). Так же в конфе хранится описание каждого action - жестко типизированы входящие параметры для каждого action'a (заданы типы string, text, login, password, email, integer,...)
qInputFilter — фильтрация входящих данных по правилам описанным в конфе модуля
qModRunner — запуск самого модуля и его action'a на исполнение
%UserModule%, %Action% — без комментариев
qViewer — вывод результата - в общем шаблонизатор. Тягает данные из qResponseManager. Почему из qResponseManager, а не из qResponse? Предполагаю что будут случаи когда один модуль будет запрашивать другой, соответсвенно будет несколько ответов. Т.е. возможна такая ситуация:
Так же стоит подумать над такими объектами как qUser, qCheckAccess. Думаю их внедрение в схему работы можно будет сделать с помощью hook'ов. Например между вызовами ( --> ) в схеме поставить before и after хуки.
А вот собственно и вопрос... Не могу придумать изящный вариант вызова хуков. Вот один вариант такой, но писать в методах не очень хочется...
Прошу помочь советом/критикой. Спасибо.
-~{}~ 28.09.08 18:22:
Пока в голове крутится применение нечто похожего на AOP
Сначала приведу схему работы, затем описание.
PHP:
+----------+
| qRequest |
+----------+
|
|
| +-----------------+
+--> | qRequestManager |
| +-----------------+
| |
| | +------------------+ +-----------+
| +--> | qResponseManager | ---------------------------------------------> | qResponse |
| +------------------+ | |
| | |
| +--------------------------------------------------------------------------------+ | |
+--> | qController | | |
| | | |
| +---------+ +------------+ +--------------+ +------------+ | | |
| | qRouter | --> | qModLoader | --> | qInputFilter | --> | qModRunner | | | |
| +---------+ +------------+ +--------------+ +------------+ | | |
| | | |
+--------------------------------------------------------------------------------+ | |
| | |
| +--------------+ | |
+--> | %UserModule% | | |
| ---------- | | |
| %Action% | | |
+--------------+ | |
| | |
| | |
+---------+ | | |
| qViewer | <-------------+ | |
+---------+ +-----------+
|
|
+-----+ |
| end | <--+
+-----+
qRequest — содержит в себе всю информацию о пришедшем запросе (REQUEST_URI, _GET, _POST, ...)
qRequestManager — менеджер всех пришедших запросов. Содержит стек всех запросов и активный запрос, который обрабатывается в данный момент
qResponseManager — менеджер ответов, для каждого пришедшего запроса создает объет qResponse, так же составляется стек ответов и имеется активный ответ
qResponse — ответ на активный запрос. Данный объект содержит всю информацию, которую будут отдавать пользовательские методы в ходе своей работы, а так же служебная инфа будет присутствовать от системных модулей
qController — думаю без комментариев
qRouter — парсит пришедший REQUEST_URI, выделяет так называемый path, action и все переменные. Переменные могут быть нескольких типов: path-args (те что заданы например таким образом: /company/news/id:10), get-args - обычный _GET.
Так же qRouter определяет по path какой модуль необходимо запустить, если нет такого path на сайте, то соответственно модуль будет 404
qModLoader — загружает конфу модуля. Конфа модуля содержит список возможных действий. Отмечено действие по умолчанию (для случая когда что-то некорректно указано или просто не указан action). Так же в конфе хранится описание каждого action - жестко типизированы входящие параметры для каждого action'a (заданы типы string, text, login, password, email, integer,...)
qInputFilter — фильтрация входящих данных по правилам описанным в конфе модуля
qModRunner — запуск самого модуля и его action'a на исполнение
%UserModule%, %Action% — без комментариев
qViewer — вывод результата - в общем шаблонизатор. Тягает данные из qResponseManager. Почему из qResponseManager, а не из qResponse? Предполагаю что будут случаи когда один модуль будет запрашивать другой, соответсвенно будет несколько ответов. Т.е. возможна такая ситуация:
PHP:
+----------+
| qRequest |
+----------+
|
| +-----------------+
+-->+--> (qResponse, qController, ...) --> | %UserModule% |
| | ---------- |
| | %Action% |
| | call some url |
| +-----------------+
| +----------+ |
+------ | qRequest | <------------------------------+
+----------+
А вот собственно и вопрос... Не могу придумать изящный вариант вызова хуков. Вот один вариант такой, но писать в методах не очень хочется...
PHP:
qRequest->send(); // посылает запрос в контроллер
// сам класс
class qRequest {
fucntion send () {
qHook::dispatch('qRequest',qHook::BEFORE);
...
qHook::dispatch('qRequest',qHook::AFTER);
}
}
-~{}~ 28.09.08 18:22:
Пока в голове крутится применение нечто похожего на AOP