Міні API на Lumen

міні

Структура проекту схожа на Laravel:

Eloquent

Впадає у вічі відсутність папки /config. Справа в тому, що Lumen повністю покладається на вміст .env файлу. Приклад вмісту:

Всі можливі налаштування можна підглянути у vendor/laravel/lumen-framework/config/.

Структура БД

Припустимо, нам потрібна сутність пост, плюс 2 методи – реєстрація та логін. Для створення міграцій скористаємося командною утилітою artisan.

Тепер у папці /database лежить 2 нових файли. У кожному по 2 методи, up і down - міграція та скасування міграції. Так виглядає метод up у таблиці users:

Міграції готові, намагаємося їх застосувати:

Також за замовчуванням вимкнено ORM Eloquent і фасади. Штуки корисні, тому я їх також увімкнув. Тепер все має вийде:

(art - це alias для php artisan)

Також створимо моделі Eloquent для цих таблиць. Наприклад, модель посту:

Моделі дозволяють з меншим болем віддавати дані методів, т.к. вони дбають про взаємозв'язок таблиць. Звичайно, продуктивність «сирих» запитів до БД краща, але швидкість розробки за такого підходу неухильно деградуватиме. Такі запити доречні, як на мене, лише для статистичних вибірок.

Контролери

У Laravel 5 є чудовий Trait, який дозволяє зробити всю реєстрацію в два клацання пальців. На жаль у Lumen такого немає. Також зараз прийнято не записувати всі роути в один файл, а користуватися анотаціями, наприклад:

Ця інструкція говорить, що контролер RESTful. Т.о. маючи перед очима 1 відкритий файл вже є розуміння, як звертатись до методів, і що за фільтри вони мають. Робиться це за допомогою ліби laravelcollective/annotations. Але з Lumen вона несумісна, тому всі роутидоведеться пхати в /app/http/routes.php:

У нормальному додатку цей файл стає монструозним швидко.

Lumen, як і Laravel, має Middleware, які можуть або фільтрувати певні запити, або робити будь-які корисності для кожного запиту. Усі такі фільтри лежать у /app/Http/Middleware/. Для того, щоб Lumen знав про їхнє існування, потрібно додати відповідні класи /bootstrap.app.php.

Приклад профіту від використання Eloquent можна побачити у методі show(). Клієнту надається не тільки інформація про пост, але також про асоційованого користувача.

respondWith* методи — допоміжні для надання коду якоїсь організованості. Загалом метод може повертати навіть звичайний рядок.

Висновок

Не дарма заявлено, що Lumen повністю сумісний із Laravel, т.к. після всього написаного я не відчуваю, що щось написав про Lumen.

Але все ж таки при розробці навіть вищеописаного функціоналу залишився осад: — несумісний з бібліотеками, написаними для Laravel. Ті ж інструкції де-факто стандарт; - для входження потрібно знати Laravel, т.к. багато що, описане в доках Laravel не працює, а в доках Lumen написано мало. Доводиться дивитись вихідники. Наприклад фасади доступно далеко не всі. Відсутні потрібно реєструвати самому, ручками; - завести тести у мене не вдалося, т.к. чомусь у метод не прилітає $_POST.

У мене тільки одне питання — навіщо потрібний Lumen, коли є Laravel? Хіба є люди, які хочуть мегапродуктивності та при цьому не пишуть своє рішення?

Хардкорна конфа за С++. Ми запрошуємо лише профі.