RESTFul API

10 Марта 2021 17:52 (Редактировано: 10 Марта 2021 18:40)

Базовый функционал

Для начала нужно создать папку в корне проекта 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();

Здесь можно настроить путь к каталогу с контроллерами, подключить свой пакет, указать префиксы контроллеров и многое другое.

  1. 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