За последние несколько лет мне пришлось создать много API на PHP. Большая часть из них была RESTful. Первый раз это было интересно — часы обсуждения формата ответа, содержимого ошибок, вариантов авторизации и прочей романтики. Во второй раз не покидало чувство дежавю. На третий раз уже было понятно — надо что-то менять…

Ну и на четвёртый раз, когда передо мной поставили задачу создания API, параллельно разработке основного проекта, я приступил к созданию универсальной платформы для создания API в котором уже будут решены все «главные» вопросы:

  1. Формат ответа (в том числе и ошибок)
  2. Форматирование даты
  3. Ведение документации
  4. Авторизации и аутентификации
  5. Валидация запросов
  6. и многое другое

Как прагматичный человек сначала я поискал, что же есть готового. Кое-что таки есть.

api-platform


Сайт: api-platform.com
Очень мощное решение. Сделано на основе php-фреймворка Symfony. Есть всё что нужно и даже больше. Наверно, для тех кто любит программирование через конфигурации и Symfony, это то что нужно. Увы я не отношусь к этой категории.

apigility


Сайт: apigility.org
Не менее мощное решение. На этот раз на основе фреймворка Zend. Это даже какая-то CMS для создания API, причём и RESTful и RPC. Наверно, для тех кто любит программирование с помощью мышки, это то что нужно. Увы я и к этой категории не отношусь.

Есть и другие решения, вот неплохая подборочка.

Но в итоге ничего милого моему сердцу выбрать не удалось. Зато удалось сформировать несколько принципов и требований к будущему проекту:

  1. Код, а не аннотации и конфигурации
  2. Никаких UI
  3. Создание полностью готового API одной командой
  4. Автогенерация документации. Желательно по коду, а не из аннотаций
  5. Простота
  6. Минимум велосипедов

Моё решение


Америки я не открыл. Просто взял хорошие компоненты, собрал их вместе, написал весь необходимый boilerplate-код для работы и собрал composer проект.

Краеугольный камень — это стандарт представления jsonapi. С помощью него решены почти все «холиварные» вопросы. Мне осталось только принять решение по формату запросов с фильтрацией, сортировкой и постраничной навигацией. За вывод отвечает пакет json-api от neomerx (Кстати, не так давно он тоже собрал свой api starter pack).

В качестве основы я выбрал Slim3. Грамотно спроектированный, быстрый, легко расширяемый и простой.

Для работы с БД ORM Eloquent. Удобная, сравнительно быстрая и простая.

Работу с правами и контролем доступа построил на основе Zend ACL. На удивление простой пакет для работы с правами.

Авторизация на основе JWT токенов

Документацию генерирую по комментариям написанным в коде с помощью ApiDocJS. Почему не Swagger? Пробовал и его, но мне apidoc понравился больше.

Код размещён на github, проект доступен на packagist.

Сразу после установки у вас будет полностью готовое API со всем необходимым. Буду рад, если кто-то применит пакет в работе. Я уже успел сделать 1 проект на нём (+ тот проект, который делал параллельно с bootstrapi) — полёт нормальный.
Поделиться с друзьями
-->

Комментарии (10)


  1. hudson
    29.12.2016 14:16

    Раз уж были упомянуты решения на базе Symfony и Zend, я бы хотел дополнить список решением на Laravel — DreamFactory. Позиционируется как BaaS решение. Есть как онлайн сервис (без установки у себя на сервере), так и бесплатная/платные standalone версии, умеет генерировать API как к популярным СУБД, так и другим API, файлохранилищам и т.д. Есть примеры интеграции с Android / iOS / React / Angular 1&2.


  1. worldmind
    29.12.2016 15:40

    swagger хорош


  1. TyVik
    29.12.2016 16:52

    Ну некоторые прям в БД реализовывают. Прикольно, конечно, но не более того.


    1. savostin
      02.01.2017 16:10

      Кстати, почему нет?


      1. TyVik
        02.01.2017 16:14

        Если нужен только доступ к данным, то без проблем, но, как правило, на бэкенде ещё есть некая логика: авторизация, валидация данных с клиента, очередь задач… Это всё можно сделать и хранимками (в pgadmin4 даже дебаггер есть), но проще прикрутить какой-нибудь Django или Yii. Так решение получится более сопровождаемое.


        1. kot5150
          06.01.2017 11:42

          Именно поэтому и сделан bootstrapi. Тонкая надстройка для имплементации бизнес-логики над уровнем данных. Ну и кроме всего прочего — полностью готовая к работе после установки, все типовые вещи повторяющиеся из проекта в проект уже включены и настроены.


  1. am-amotion-city
    29.12.2016 20:46

    Открыли github, убедились, что тестов нет, навсегда закрыли github.


  1. Daiverspb
    30.12.2016 11:34

    Тот случай, когда думаешь о том же, а уже кто-то реализовал. Спасибо, попробую ваш продукт в своём проекте.


  1. vitaly_KF
    31.12.2016 15:36

    А чем это отличается от Yii Rest например?


    1. kot5150
      31.12.2016 16:21

      Во-первых bootstrapi уже полностью готов к работе после установки, а Yii Rest это модуль и вам нужно будет его «приготовить». Это ключевая разница. Во-вторых в bootstrapi настроен jsonapi, с Yii Rest вам нужно будет либо самостоятельно изобретать формат, либо имплементировать jsonapi. Вопрос с документацией опять же придётся решать.
      Кстати, первое API, которое я упоминал в статье я делал на Yii1, а второе на Yii2 с этим модулем. Это очень хороший инструмент.