Базовый функционал
Для начала нужно создать папку в корне проекта rest. В этой папке создаем файл index.php. В файл помещаем следующий код:
<?php
// Загрузить MODX
require_once dirname(dirname(__FILE__)) . '/config.core.php';
require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');
// Загрузить любые классы или пакеты (модели), которые вам потребуются
$path = $modx->getOption('mypackage.core_path', null,
$modx->getOption('core_path').'components/mypackage/') . 'model/mypackage/';
$modx->getService('mypackage', 'myPackage', $path);
// Загрузить класс modRestService и передать ему некоторую базовую конфигурацию
$rest = $modx->getService('rest', 'rest.modRestService', '', array(
'basePath' => dirname(__FILE__) . '/Controllers/',
'controllerClassSeparator' => '',
'controllerClassPrefix' => 'MyController',
'xmlRootNode' => 'response',
));
// Подготовить запрос
$rest->prepare();
// Удостовериться, что пользователю предоставлены необходимые права доступа; вернуть пользователю ошибку 401 в обратном случае
if (!$rest->checkPermissions()) {
$rest->sendUnauthorized(true);
}
// Выполнить запрос
$rest->process();
Здесь можно настроить путь к каталогу с контроллерами, подключить свой пакет, указать префиксы контроллеров и многое другое.
controllerClassPrefix
— префикс контроллеров. Например, если контроллер ApiControllerResources, то файл должен называться Resources.php, а доступен контроллер будет по адресу site.com/rest/resources/
Судя по исходникам, выясняется, что $rest->checkPermissions() ничего из себя не представляет и просто возвращает true. Поэтому проверку прав надо настраивать самому.
Далее, необходимо положить в папку rest файл .htaccess с минимальным содержимым для работы Modx, но и со специальными директивами для rest:
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]
RewriteRule "/\.|^\.(?!well-known/)" - [F]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ rest/index.php?_rest=$1 [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ rest/index.php [QSA,NC,L]
Теперь настраиваем первый контроллер на вывод ресурсов:
<?php
class ApiControllerResources extends modRestController {
public $classKey = 'modResource';
public $defaultSortField = 'id';
public $defaultSortDirection = 'ASC';
}
После этого, отправляя запросы на site.com/rest/resources/ или site.com/rest/resources/10 мы будем получать список всех ресурсов или 1 ресурс в формате json