Следующим этапом будет создание точки входа 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. Может показаться сложным на первый взгляд, но на самом деле все в конечном итоге просто:

  1. Точка входа (коннектор)
  2. Запуск процессора (класса) и обработка информации
  3. Выдача ответа.

 

Затем необходимо определить по 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'),
            ],
        ]);
    }
← MODx + NEXT JS (React). Часть 1MODx + NEXT JS (React). Sitemap. Часть 4 →