Блог/Обработка запросов MODX Revolution

Процесс обработки запроса MODX Revolution

Автор: Кудашев Сергей

Пришла в голову разработка одного компонента для MODX Revolution. Выяснилось, что для его разработки надо хорошо понимать процесс того, как работает данная CMS и как она обрабатывает запросы к сайту. Предлагаю подробно рассмотреть и попытаться разобраться, как происходит обработка входящих запросов в MODX Revolution.

Небольшой дисклеймер по данному материалу. Данный разбор я делаю больше для себя, поэтому некоторые несущественные моменты могут быть опущены, и в последующем могут быть добавлены. В целом тут подробно рассмотрена последовательность разбора и действий с запросом поступающим на обработку в MODX Revolution.

Итак, каждый запрос передается в файл index.php. Внутри данного файла определяется константа MODX_API_MODE, которая позволяет просто получать доступ к API не инициируя обработку запроса. Далее определяется переменная, способная полностью отключить кеш CMS. После этого инклудится config.core.php с прописанными в нем путями. Затем инклудится основной класс model/modx/modx.class.php (который в свою очередь заинклудит xpdo/xpdo.class.php). После этого начинается сбор всего вывода в буфер, инстанциируется класс modX, инициализируется контекст ‘web’, и в случае если не была определена API константа вызывается метод modX->handleRequest().

В методе handleRequest() определяется существует ли объект запроса (класс modRequest), и если его нет, то он инстанциируется. В момент инстанциации, кстати, задаются переменные данных из запроса, которые состоят из данных полученных из GET, POST, COOKIE, REQUEST. После чего управление передается на метод modRequest->handleRequest(). В нем сначала подгружается обработчик ошибок. Потом очищаются все входные данные методом sanitizeRequest(), после чего выбрасывается первое событие 'OnHandleRequest'.

По завершению обработки события 'OnHandleRequest' проверяется, находится ли сайт во включенном состоянии. Если сайт включен, то проверяется статус публикации, после чего задаются переменные resourceMethod, и в зависимости от ее значения, resourceIdentifier (по которому будет определяться, какой именно документ мы запросили). Свойство resourceIdentifier обрабатывается, в зависимости от системных настроек CMS (с ЧПУ или без) и находится нужный документ или отдается 404 страница (если метод alias). Выполняется метод beforeRequest() и выбрасывается событие 'OnWebPageInit'. Проверяется ресурс и если он все таки не был получен, то отдается 404 страница. После чего управление передается методу modRequest-> prepareResponse().

В методе prepareResponse вызывается еще один из before методов beforeProcessing(), после чего выбрасывается событие 'OnLoadWebDocument'. После этого определяется объект response (через метод getResponse() запрашивается класс modResponse) и управление передается его методу modResponse->outputContent().

В методе outputContent() определяется тип контента (ContentType) текущего ресурса. Если он не бинарный, то происходит его обработка, а если да, то вызывается метод beforeRender() и выбрасывается событие 'OnWebPagePrerender'. Для небинарного содержимого оно выбросится позже. Вернемся к обработке не бинарного ресурса. Сначала определяются внутренние переменные, которые будут содержать вывод ресурса (ей будет присвоено значение $this->modx->resource->process()) и привязанные к нему скрипты (jscripts, sjscripts, loadedjscripts).

Остановимся на методе process() на этом этапе, так как это фактически основной момент обработки контента и именно здесь происходит парсинг и обработка тегов MODX внутри шаблона. В данном методе проверяется, является ли переданный ресурс кешируемым, обработанным (_processed) или уже содержащим контент (_content) и если нет, то происходит следующее. Инстанциируется parser (метод getParser() запрашивает класс modParser), определяется есть ли у данного ресурса шаблон и если есть, то он обрабатывается методом modTemplate->process() и ресурс маркируется как обработанный. Метод process() класса modTemplate проверяет не обработан ли вывод (_processed) и если нет, то последовательно применяет к выводу метод modParser->processElementTags() заданное в настройках количество итераций (фактически количество проходов парсера). Тут надо отметить, что в processElementTags будет выброшено событие 'OnParseDocument'. После обработки вывод фильтруется методом filterOutput(). Если же шаблона нет, то будет обработан контент ресурса, но в этом случае modParser->processElementTags() будет применен к выводу сразу.

Продолжим на месте, где мы назначили переменную вывода ресурса и скрипты. Далее будет инстанциирован парсер. После этого вывод будет последовательно обработан методами modParser->processElementTags() (один раз без вырезания тэгов, второй раз с вырезанием) заданное количество итераций. После чего к выводу будут добавлены js скрипты, но только в случае, если тип содержимого text/html.

После всего этого вызывается очередной из before методов метод beforeRender() и выбрасывается событие 'OnWebPagePrerender' и обрабатываются тэги вставляющие информацию о выполнении. Далее определяются, какой тип контента следует отдать (по умолчанию 'text/html') и кодировка контента. Отдается заголовок. Проверяется, не находимся ли мы в режиме превью, и если нет то добавляются дополнительные заголовки. Далее регистрируется функция, которая выполнится при завершении скрипта (это метод _postProcess()). Кстати, в данном методе будет выброшены события, при определенных обстоятельствах это будет 'OnBeforeSaveWebPageCache', и в любом случае будет выброшено событие 'OnWebPageComplete'.

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

Возможно материал окажется кому-то полезным :) Если заметили неточность или считаете, что где-то допущена ошибка, напишите, пожалуйста, в комментариях.

Тэги: MODX, Revolution
Просмотров: 4845
Комментариев:

Комментарии (0)