Как работает НПЖ:
Перед тем, как читать дальше, попробуйте ответить на простой вопрос: как называется САМЫЙ ГЛАВНЫЙ ОБЪЕКТ В НПЖ?
«Обертка»: index.php
1) при вызове
index.php первой вызывается функция
ob_start(), которая отключает вывод в
stdout (он обрабатывается с помощью функции
ob_gzhandler())
2) подключаются классы
- core/classes/RSS.php
- npj/classes/NpjRSS.php
- core/classes/Debug.php
- core/classes/RequestHandler.php
- npj/classes/NpjRequestHandler.php
3) создаются объекты (перечисляю самые важные)
- $rss – объект класса NpjRSS
- $dbg – объект класса Debug
- $rh – объект класса NpjRequestHandler. Он разбирает URL (который трактуется как команда) и берет на себя взаимодействие с сервером. Вся дальнейшая работа с НПЖ будет протекать в зоне видимости и с помощью методов этого объекта.
4) Вызывается метод
HandleRequest() объекта
$rh, результат работы которого выводится в броузер с помощью
$rh->Output($rh->HandleRequest( )); Класс
Debug (и, соответственно, его экземпляр
$dbg) обеспечивает запись лога всех действий НПЖ (который при нормальной работе никуда не выводится).
5) В случае ошибки управление передается снова в
index.php и вызывается метод
$rh->End();
6) Вызывается
ob_end_flush(), что сбрасывает в
stdout лог произошедшего, хранящийся в объекте
$dbg.
«Основной обработчик»: /npj/classes/NpjRequestHandler.php
Примечание:
class NpjRequestHandler extends RequestHandler (адрес последнего:
/core/classes/RequestHandler.php)
1) Для создания объекта
$rh вызывается конструктор
NpjRequestHandler("config.php")
2) При конструировании
$rh сначала вызывается метод
RequestHandler::RequestHandler() (собственно, это конструктор класса
RequestHandler), с файлом
config.php в виде параметра.
a)
config.php, в свою очередь, подключает следующие файлы конфигурации:
- core/config.php
- npj/config.php
- config_tunes.php
- config_db.php
- config_modules.php
б)
RequestHandler() подключает с помощью метода
RequestHandler::UseClass() (это обертка для
require(), по сути) следующие классы:
- Debug
- DBAL – /core/classes/DBAL_adodb.php
- StateSet
- Principal
- TemplateEngine
- ObjectCache
3) В результате объект
$rh содержит все настройки и переменные, нужные для работы, и может вызывать методы для разбора URL, понимаемого как команда программе, чтобы передать управление обработчику этой команды. Главный метод для этой цели:
$rh->_HandleRequest() (который вызывает, в свою очередь, другие приватные методы). (Правильно заметили разработчики в комментах:
NpjRequestHandler::_HandleRequest() – это holy crap!)
Что читать дальше
Моего пера: $rh – детали реализации.
Документация по разбору URLа где-то была, а вот все ссылки на доки по Манифесто сдохли.
Но для знакомства с общей концепцией можно читать доки к Rocket, который мало того что те же люди делали, так еще, подозреваю, значительная часть кода Manifesto перешла в него без особых исправлений (впрочем, здесь я могу сильно ошибаться).
В общем, читать:
Общее устройство ядра Rocket
Диаграммы обработки основного запроса – RequestHandler
Движок шаблонов RocketTE
В комментах к RequestHandler из Rocket написано:
" [RequestHandler] организует последовательность обработки и функциональное окружение. Служит мостом для сообщения между собой подключаемых модулей".
А на диаграмме Николая Яремко указаны два главных направления обработки запроса: 1) с редиректом (запросить другую страницу, попутно что-то сделать с данными) и 2) без редиректа (обработать данные, модифицировать текущую страницу) – ЭТО ВАЖНО!
Всплыли еще вот такие подробности (достаточно, в принципе, чтобы уяснить себе общее устройство модулей):
Сторонние модули
Небольшое руководство для написания модулей
Итак, САМЫЙ ГЛАВНЫЙ ОБЪЕКТ В НПЖ называется $rh, класс NpjRequestHandler