Почему мы отказались от Lumen?

Перевод статьи: https://medium.com/once-upon-a-site/why-we-ditched-lumen-php-b7ab2bcefff9

Lumen это урезанная версия мощного и ныне популярного PHP фреймворка Laravel, ориентированного на скорость работы и обработке изолированных реквестов. В Lumen нет всех свистоперделок, которые есть в Laravel, но для обработки API запросов они и не нужны. Например, сессии, куки, blade шаблоны отсутствуют в Lumen. Он не предназначен для разработки сайтов, так что всё это вырезано.

Это послужило причиной отказа от Laravel Spark в 2018 году и перехода на Lumen, как я уже упоминал в прошлой статье. Потому что Lumen был отличным решением для построения масштабируемых и высокопроизводительных API.

Пока мы не начали работать с ним.

Мы получили много преимуществ, когда мигрировали на Lumen. API был полностью отделён от клиентского WEB приложения, производительность была потрясающей и всё казалось отлично.

Основная проблема, с которой мы столкнулись, были библиотеки. Тот же Laravel Horizon для управления очередями на Redis, Laravel Passport для oAuth. Чтобы найти способ использовать их с Lumen, нам пришлось использовать хаки и сторонние библиотеки.

Далее нам понадобился Laravel Cashier, чтобы интегрировать обработку платежей.

И это была последняя капля.

Я осознал, что версии наших библиотек были устаревшими, потому что не было доступно хаков для новых версий. Особенно, когда мы попытались обновить нашу Lumen 5.6 до последней версии Lumen 7.x.

После долгого поиска и прослушивания подкаста от Тейлора Отвелла, который сказал, что время начальной загрузки составляет около 5мс, что очень мало, мы решили начать приключение и мигрировать наш API на совершенно новое Laravel приложение. Некоторые люди говорили, что из-за другой библиотеки роутов, пустое приложение на Lumen загружается на 20% быстрее, чем Laravel. Они так же говорили, что это применимо только для "Hello World" бенчмарков, где большая часть работы это фактически маршрутизация. В реальных приложениях это значение намного ниже. В любом случае моё мнение на этот счёт — эти 20% разницы в производительности не стоят того, чтобы тратить время с Lumen.

Так что пришло время отказаться от хакнутой древней версии Lumen и использовать Laravel. У есть него много возможностей, которые нам были нужны для ускорения разработки, и якобы 20% разница в производительности не стоила того, чтобы тратить время на возню с хаками, устаревшими библиотеками с уязвимостями и тратить наши нервы.

Процесс миграции шёл очень гладко и на первый взгляд должен был занять 1 неделю.

  1. Создать новое Laravel приложение.
  2. Скопировать все тесты из Lumen и добавить новые директории с тестами в phpunit.xml.

Далее запустить phpunit и посмотреть, какие тесты запустятся и провалятся первыми, а далее запускать эти тесты отдельно.

И, наконец, добиться, чтобы все тесты проходили без ошибок:

  • Изменить extends \TestCase на extends TestCase и добавить namespance use Tests\TestCase;.
  • Изменить use DatabaseTransactions на use RefreshDatabase чтобы накатывать миграции перед каждым тестом.
  • Добавить миграции и фабрики
  • Интегрировать функции-helpers.
  • Запустить тесты и исправить то, что попадало.

После нескольких дней с падающими тестами, мы наконец-то могли мигрировать весь код на последнюю версию Laravel.

С тех пор, мы обновляем библиотеки каждую неделю, потому что 100% покрытие тестами позволяло нам уверенно применять обновления и отправлять на production.

Мне любопытно, если вы тоже переходили с Lumen на Laravel, с какими проблемами и преимуществами столкнулись вы.