Следующим этапом будет создание точки входа api для будущего бэкенд приложения. Поскольку я делаю это через свой компонент, то адрес в данном случае будет не в корне проекта.
assets/components/ajax/action.php
<?php
header('Content-Type: application/json; charset=utf-8');
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$properties = array();
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');
//check autoPublish
$modx->cacheManager->autoPublish();
$ajax = $modx->getService('ajax', 'ajax', $modx->getOption('ajax_core_path', null,
$modx->getOption('core_path') . 'components/ajax/') . 'model/', $properties
);
$path = MODX_CORE_PATH . 'components/ajax/processors/web/';
$response = $modx->runProcessor($_REQUEST['action'], $_REQUEST, array(
'processors_path' => $path
));
if (is_array($response->response)) {
$json = $modx->toJSON($response->response);
}
else {
$json = $response->response;
}
echo $json;
@session_write_close();
exit();
В первой части происходит инициализация MODx. Но самое главное происходит здесь:
$response = $modx->runProcessor($_REQUEST['action'], $_REQUEST, array(
'processors_path' => $path
));
Именно этот кусок кода отвечает за роутинг приложения. Роутинг в данном случае не использует сторонних зависимостей, а реализован стандартными средствами и просто запускает процессоры(классы) по их названию в параметре action в пути processors_path
Именно таким способом реализовано большинство компонентов для MODx. Может показаться сложным на первый взгляд, но на самом деле все в конечном итоге просто:
- Точка входа (коннектор)
- Запуск процессора (класса) и обработка информации
- Выдача ответа.
Затем необходимо определить по URL что это за ресурс и вывести необходимую информацию. На помощь приходит стандартная функция findResource. Её я помещаю в отдельный процессор, он будет основным при обращении к любой странице. На данный момент он служит для выдачи и обработки основной информации, таких как определение ресурса, генерация title, выдача меню, промо, контактов и т.д.
components/ajax/processors/web/config/get.class.php
<?php
require_once MODX_CORE_PATH . 'model/modx/modprocessor.class.php';
class GetConfigAjax extends modProcessor
{
public $classKey = 'modResource';
public $objectType = 'modResource';
public function process()
{
$url = $_REQUEST['url'];
$parts = parse_url($url);
$url_folder = $parts['path'];
if (empty($url_folder)) {
$res_id = $this->modx->getOption('site_start');
} else {
if (!$res_id = $this->modx->findResource($url_folder, 'web')) {
$res_id = $this->modx->findResource($url_folder . '/', 'web');
}
}
$resource = $this->modx->getObject('modResource', $res_id);
return $this->success('', [
'resource' => [
'id' => $resource->get('id'),
'isfolder' => $resource->get('isfolder'),
'description' => $resource->get('content'),
],
]);
}