
mxHeadless
REST API gateway для headless-фронтендов на MODX 3. Ресурсы, объекты, OpenAPI, API keys и OAuth
- MODX 3
- PHP 8.1


Сторонние Extras регистрируют объекты без правок core. Точка входа: событие OnMxHeadlessRegister.
<?php
/** @var \MODX\Revolution\modX $modx */
switch ($modx->event->name) {
case 'OnMxHeadlessRegister':
/** @var \MxHeadless\Extension\ExtensionApi $api */
$api = $modx->event->params['api'];
$api->registerObject(
\MxHeadless\Definition\ObjectDefinition::create('products')
->setName('products')
->class(\MiniShop3\Model\msProduct::class)
->fields(['id', 'pagetitle', 'price', 'article'])
->filterable(['id', 'price', 'parent'])
->sorts(['id', 'price', 'pagetitle'])
->readable()
);
break;
}После обработчиков реестр и коллекция маршрутов замораживаются (ExtensionApi::freeze()). Поздний registerObject или registerRelation бросает RegistryFrozenException, поздний registerEndpoint бросает RuntimeException с текстом Route collection is frozen.
| Метод | Назначение |
|---|---|
registerObject(ObjectDefinition) | xPDO-класс под публичным именем |
registerRelation(string $object, RelationDefinition) | Связь для include= |
registerEndpoint(...) | Свой маршрут с обработчиком |
registry() | Доступ к зарегистрированным определениям |
ObjectDefinition::create('locations')
->setName('locations')
->class(YmlLocation::class)
->fields(['id', 'title', 'lat', 'lng'])
->filterable(['id', 'city_id'])
->sorts(['id', 'title'])
->readable()
->creatable(false)
->hiddenFields(['internal_note'])
->protectedFields(['owner_id'])
->contexts(['web']);Флаги: readable, creatable, updatable, deletable, searchable, hiddenFields, protectedFields, immutableFields, requiredFields, primaryKey, contexts, contextAccessGated.
contextAccessGated отключает проверку списка contexts и переключает контроль доступа на проверку ACL по ключу контекста конкретной записи. Так помечен core-объект contexts.
| Событие | Когда |
|---|---|
OnMxHeadlessRegister | Регистрация objects, relations, endpoints |
OnMxHeadlessRegisterMiddleware | До freeze стека. registrar: prepend / append |
OnMxHeadlessBeforeRequest | После auth, до handler. Можно подменить request через $modx->event->returned |
OnMxHeadlessAfterRequest | После handler. Можно подменить response |