Розробка PHP (Laravel) бекенду для мобільних додатків
Laravel — не «дешевий» вибір, а прагматичний. Коли у клієнта вже є PHP-команда, або коли потрібно за 4–6 тижнів випустити робочий API з автентифікацією, push-сповіщеннями, файловим сховищем та чергами — Laravel Sanctum + Eloquent + Horizon перекривають 90% задач без лишньої інфраструктури.
Що чаще всього йде не так
Eloquent N+1 убиває мобільний API. User::all() з ->posts всередину foreach — класика. На колекції в 30 елементів летить 31 запит, відповідь 600ms замість 20ms. Мобільний клієнт чекає, потім retry, потім скарга в сторі. Фікс — with(['posts']) при завантаженні, ->load() якщо вже завантажили. Діагностуємо через Laravel Debugbar або Telescope з підрахунком duplicate queries.
Очереди без supervisor. Mail::send() або FCM-push у HTTP-handler — запит висить поки Firebase не відповів. Якщо APNs лагує (буває), мобільний клієнт отримує 30-секундний таймаут. Усі асинхронні операції — у dispatch(new SendPushJob($payload)) з Laravel Horizon для моніторингу Redis-черг.
Як будуємо Laravel-бекенд для мобайла
Автентифікація — Laravel Sanctum для SPA/mobile token-based auth. Токени зберігаються в таблиці personal_access_tokens, при логіні видаємо пару access + refresh. Sanctum з коробки не робить refresh rotation — реалізуємо через кастомний RefreshTokenController з інвалідацією старого токена в БД.
Для OAuth через соцмережі — Laravel Socialite з драйверами Google, Facebook, Apple. Apple Sign In вимагає окремої уваги: nonce валідується у id_token, а email Apple надає тільки при першому логіні — зберігаємо відразу.
Push-сповіщення: пакет laravel-notification-channels/fcm для FCM та laravel-notification-channels/apn для APNs. Сповіщення — через Laravel Notifications API ($user->notify(new OrderStatusChanged($order))), канал вибирається за методом via().
Реальний кейс: маркетплейс для iOS/Android, ~25 000 DAU. REST API на Laravel 10, PostgreSQL, Redis для сеансів та кешу. Endpoint каталогу товарів (/api/v1/products) з фільтрами та пагінацією. Перша версія — Eloquent з ->paginate(20), час відповіді 350–800ms залежно від фільтрів. Після оптимізації: raw query через DB::select() для складної вибірки + Cache::remember() на 60 секунд для популярних фільтрів — p95 став 40ms. Мобільний клієнт перестав показувати skeleton-лоадер.
Структура API-проекту
app/
├── Http/Controllers/Api/V1/ — контролери з версіонуванням
├── Http/Resources/ — API Resources для форматування відповідей
├── Http/Requests/ — Form Request validation
├── Models/ — Eloquent-моделі
├── Jobs/ — асинхронні задачі (пуші, листи, вебхуки)
└── Notifications/ — Laravel Notifications
routes/api.php — маршрути з `sanctum` middleware
API Resources замість ->toArray() напрямку — це важливо. Resource контролює поля відповіді, вкладені відносини завантажуються через whenLoaded() без ризику N+1, та структура відповіді не змінюється несподівано при зміні моделі.
Деплой
Laravel Octane (Swoole або RoadRunner) дає 3–5x пририст throughput порівняно з PHP-FPM — актуально якщо бюджет не дозволяє горизонтальне масштабування. На Swoole важливо враховувати: статичні властивості класів живуть між запитами, ServiceProvider не пересоздається — потрібно явно скидати стан через octane:table або уникати stateful-сервісів.
Supervisor для черг: php artisan queue:work --queue=high,default --sleep=3 --tries=3. Laravel Horizon дає веб-інтерфейс для моніторингу воркерів та метрик Redis-черг.
Терміни: API з 12–18 ендпоінтами, автентифікація, push-и, S3-сховище — 3–5 тижнів. Складний маркетплейс з продавцями, платежами та аналітикою — 8–12 тижнів.







