За последние несколько лет мне пришлось создать много API на PHP. Большая часть из них была RESTful. Первый раз это было интересно — часы обсуждения формата ответа, содержимого ошибок, вариантов авторизации и прочей романтики. Во второй раз не покидало чувство дежавю. На третий раз уже было понятно — надо что-то менять…
Ну и на четвёртый раз, когда передо мной поставили задачу создания API, параллельно разработке основного проекта, я приступил к созданию универсальной платформы для создания API в котором уже будут решены все «главные» вопросы:
- Формат ответа (в том числе и ошибок)
- Форматирование даты
- Ведение документации
- Авторизации и аутентификации
- Валидация запросов
- и многое другое
Как прагматичный человек сначала я поискал, что же есть готового. Кое-что таки есть.
api-platform
Сайт: api-platform.com
Очень мощное решение. Сделано на основе php-фреймворка Symfony. Есть всё что нужно и даже больше. Наверно, для тех кто любит программирование через конфигурации и Symfony, это то что нужно. Увы я не отношусь к этой категории.
apigility
Сайт: apigility.org
Не менее мощное решение. На этот раз на основе фреймворка Zend. Это даже какая-то CMS для создания API, причём и RESTful и RPC. Наверно, для тех кто любит программирование с помощью мышки, это то что нужно. Увы я и к этой категории не отношусь.
Есть и другие решения, вот неплохая подборочка.
Но в итоге ничего милого моему сердцу выбрать не удалось. Зато удалось сформировать несколько принципов и требований к будущему проекту:
- Код, а не аннотации и конфигурации
- Никаких UI
- Создание полностью готового API одной командой
- Автогенерация документации. Желательно по коду, а не из аннотаций
- Простота
- Минимум велосипедов
Моё решение
Америки я не открыл. Просто взял хорошие компоненты, собрал их вместе, написал весь необходимый boilerplate-код для работы и собрал composer проект.
Краеугольный камень — это стандарт представления jsonapi. С помощью него решены почти все «холиварные» вопросы. Мне осталось только принять решение по формату запросов с фильтрацией, сортировкой и постраничной навигацией. За вывод отвечает пакет json-api от neomerx (Кстати, не так давно он тоже собрал свой api starter pack).
В качестве основы я выбрал Slim3. Грамотно спроектированный, быстрый, легко расширяемый и простой.
Для работы с БД ORM Eloquent. Удобная, сравнительно быстрая и простая.
Работу с правами и контролем доступа построил на основе Zend ACL. На удивление простой пакет для работы с правами.
Авторизация на основе JWT токенов
Документацию генерирую по комментариям написанным в коде с помощью ApiDocJS. Почему не Swagger? Пробовал и его, но мне apidoc понравился больше.
Код размещён на github, проект доступен на packagist.
Сразу после установки у вас будет полностью готовое API со всем необходимым. Буду рад, если кто-то применит пакет в работе. Я уже успел сделать 1 проект на нём (+ тот проект, который делал параллельно с bootstrapi) — полёт нормальный.
Автор: kot5150