ZoomX - проблемы новичка при написании API

Приветствую! Всё что будет написано дальше кому-то может показаться очевидным и нестоящим внимания, но решение этих проблем отняло у меня много времени и этой заметкой я надеюсь сэкономить его другим.

1. Документация.
На сайте docs.modx.pro/ её нет. Если загуглить «zoomx документация», то по первой ссылке попадёшь сюда , а по второй на эту статью, где @Николай Савин подробно разбирает базовый сценарий построения API и даёт ссылку на ту же страницу. Однако при написании API больше пригодится вот эта статья с того же сайта.

2. Размещение контроллеров в своей директории
Как верно заметил @deleted в своём комментарии для того, чтобы ваши контроллеры хранились в удобной вам директории нужно создать в папке core/config/ файл elements.php со следующим содержимым
zoomx()->getLoader()->addPsr4('My\\Controllers\\', MODX_CORE_PATH . 'elements/controllers/');
А потом в routes.php надо прописать роуты, и вот тут есть нюанс. В статье @Николай Савин, о которой говорил выше, роуты прописаны так
$router->get('api/pages/{id}', Zoomx\Controllers\Api\Pages\GetController::class);

А в комментарии так
$router->post('request/{key}', ['\My\Controllers\MyController', 'action']);
При переносе контроллеров в кастомную папку такой вариант записи роутов не сработает
$router->get('api/pages/{id}', My\Controllers\MyController::class);
так как будет происходить поиск класса Zoomx\Controllers\My\Controllers\MyController::class. В документации написано
Если нужно указать контроллер из другого пространства имён, то первый символ в имени должен быть обратный слеш. В этом случае базовое пространство имён добавляться не будет.
Но вот так
$router->get('api/pages/{id}', \My\Controllers\MyController::class);
тоже не сработает. Решения два:
1. Удалить или изменить значение системной настройки zoomx_controller_namespace
2. Указать имя контроллера как элемент массива, поставив в начале обратный слэш:
$router->get('api/pages/{id}', ['\My\Controllers\MyController']);

3. Заголовки.
Чтобы API работало как надо и не дёргало лишние плагины, которые могут отработать с ошибкой, ОБЯЗАТЕЛЬНО во все запросы к API нужно добавлять заголовок «Accept: application/json».

Это всё над чем я тупил. Спасибо за внимание.
Артур Шевченко
03 апреля 2023, 11:17
modx.pro
1
892
+12
Поблагодарить автора Отправить деньги

Комментарии: 4

Николай Савин
03 апреля 2023, 13:49
0
А для чего нужно хранить контроллеры в «своей» папке? Чем родная не подходит?
    Артур Шевченко
    03 апреля 2023, 13:59
    +2
    Чтобы отделить свой код от чужого. К тому же, мало ли что случится, если кому-то придёт в голову мысль переустановить ZoomX. В общем, я бы назвал это инкапсуляцией.
      deleted
      04 апреля 2023, 00:00
      +1
      Я сейчас весь кастомный бэк в отдельной папке храню. Искать проще и можно на другой сайт быстро скопировать
        Максим
        04 апреля 2023, 07:18
        0
        Тоже так делаю :)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4