Генераторы кода упрощают жизнь рядового разработчика, во всяком случае призваны это делать, избавляя его от скучного написания однотипного кода. Один из таких генераторов команда Sylius'a представила как подарок для коммьюнити к Рождеству.
Предисловие
Пару недель назад, проходя собеседования, я получил тестовое задание по написанию простенького REST API на чистом PHP и MySQL. На кодирование у меня ушло около четырех часов. Наткнувшись на твит загадочного @Lakion'a о быстром создании REST API, заинтересовался и решил проверить сию новую зверюшку. Вот собственно пара слов о результатах.
Генерация API
Кратчайший путь достижения нашей цели описан в туториале и требует от нас всего трех шагов:
- Генерация сущности, которая будет являтся ресурсом нашего сервиса.
- Конфигурация SyliusResourceBundle'a.
- Конфигурация роутинга.
Такое шаманство приведет к созданию пяти привычных CRUD-методов: index (метод GET), show (GET), create (POST), update (PUT/PATCH), delete (DELETE). Теперь попробуем понять что происходит под капотом.
Итак, создание и маппинг сущности мы отдали на откуп генератору для Doctrine, который создал нам красивую сущность с методами доступа к описанным нами свойства и метаданные в выбранном нами формате. Основой же всей магии является SyliusResourceBundle, конфигурация которого позволяет добавлять пользовательские ресурсы таким образом:
sylius_resource:
resources:
my_app.entity_key:
driver: doctrine/orm # required
manager: default
templates: App:User
classes:
model: MyAppEntityEntityName # required
interface: MyAppEntityEntityKeyInterface
controller: SyliusBundleResourceBundleControllerResourceController
repository: SyliusBundleResourceBundleDoctrineORMEntityRepository
Обязательными являются всего два параметра: driver и classes.model. Если мы не определяем кастомный контроллер, то будет использоваться ResourceController, любезно предоставленный нам Sylius'ом.
Еще один интересный момент Lionframe'a — роутинг. Туториал предлагает нам сконфигурировать его так:
acme_artist:
resource: acme.artist
type: sylius.api
Чтобы эти два параметра превратились в пять маршрутов используется ApiLoader и конкретно его метод load, который и создает все пять маршрутов для кажого ресурса. При создании URL'а используется множественная форма названия ресурса (в данном случае — artists). Смысл параметра type в том, чтобы система роутинга могла отличить данные специфические роуты от обычных и соответственно для первых дергать ApiLoader.
Итоги
Создание самого деревянного REST API своими руками — несколько часов, с Lionframe'ом — несколько минут. КО подтверждает что генераторы кода несут добро. Также хотелось бы поинтересоваться у читателей насколько часто используются всяческие генераторы кода в реальных коммерческих проектах и какая часть сгенерированного кода доживает хотя бы до середины проекта?
Ссылки
- Туториал по Lionframe
- Документация SyliusRestBundle'а
- Пример реализации REST API с использованием Lionframe
Автор: hospect