ZoomX - проблемы новичка при написании API
Приветствую! Всё что будет написано дальше кому-то может показаться очевидным и нестоящим внимания, но решение этих проблем отняло у меня много времени и этой заметкой я надеюсь сэкономить его другим.
1. Документация.
На сайте docs.modx.pro/ её нет. Если загуглить «zoomx документация», то по первой ссылке попадёшь сюда , а по второй на эту статью, где @Николай Савин подробно разбирает базовый сценарий построения API и даёт ссылку на ту же страницу. Однако при написании API больше пригодится вот эта статья с того же сайта.
2. Размещение контроллеров в своей директории
Как верно заметил @deleted в своём комментарии для того, чтобы ваши контроллеры хранились в удобной вам директории нужно создать в папке core/config/ файл elements.php со следующим содержимым
А в комментарии так
1. Удалить или изменить значение системной настройки zoomx_controller_namespace
2. Указать имя контроллера как элемент массива, поставив в начале обратный слэш:
3. Заголовки.
Чтобы API работало как надо и не дёргало лишние плагины, которые могут отработать с ошибкой, ОБЯЗАТЕЛЬНО во все запросы к API нужно добавлять заголовок «Accept: application/json».
Это всё над чем я тупил. Спасибо за внимание.
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».
Это всё над чем я тупил. Спасибо за внимание.
Поблагодарить автора
Отправить деньги
Комментарии: 4
А для чего нужно хранить контроллеры в «своей» папке? Чем родная не подходит?
Чтобы отделить свой код от чужого. К тому же, мало ли что случится, если кому-то придёт в голову мысль переустановить ZoomX. В общем, я бы назвал это инкапсуляцией.
Я сейчас весь кастомный бэк в отдельной папке храню. Искать проще и можно на другой сайт быстро скопировать
Тоже так делаю :)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.