Laravel любит обещать «из коробки всё готово». Типа «смотри, у нас есть Eloquent, роутинг, контроллеры, миграции, Sanctum — бери и делай API». И оно реально так работает… пока у тебя игрушечный сервис для диплома или пет-проекта. Но как только ты выкатываешь REST API в продакшен, понимаешь: магия заканчивается, а начинается рутина — от оптимизации запросов до борьбы с авторизацией и тоннами багов на фронте.

Старт: проект за 2 минуты

composer create-project laravel/laravel api-example
cd api-example

Красиво? Да. Но по факту ты получаешь голый фреймворк, в котором дальше надо копать. База, модели, роуты, контроллеры — всё как обычно.

База: стандартная скука

.env настраиваешь под MySQL или что угодно:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password

И молись, чтобы у DBA не было плохого настроения, потому что твои миграции с $table->string('email')->unique(); могут быть восприняты как личное оскорбление.

Модели и миграции: сахар, но не всегда сладкий

php artisan make:model User -m 

создаёт тебе модель и миграцию. Вроде удобно.

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Выглядит красиво. Но потом к тебе приходит прод и говорит: «А сделай-ка 200к пользователей с разными ролями, правами, статусами». И ты начинаешь лепить костыли: дополнительные таблицы, связи, индексы, оптимизацию. Потому что «универсальная миграция из туториала» умирает быстрее, чем дешёвый VPS.

Контроллеры: CRUD за пять минут

php artisan make:controller UserController --api

Хоп, и у тебя готов каркас под CRUD.

Route::apiResource('users', UserController::class);

Звучит магически, но на практике это тупо заготовка. Захочешь что-то сложнее «создать/обновить/удалить» — например, фильтрацию, пагинацию или вложенные ресурсы — будешь вручную дописывать. И да, будешь материться, потому что фронт ждёт JSON в формате, который у тебя не совпадает с дефолтным ресурсом Laravel.

Аутентификация: Sanctum vs реальность

Laravel предлагает Sanctum — «лёгкое решение для API-токенов». И действительно:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

В config/auth.php настраиваешь драйвер, запускаешь миграции, и готово. Пользователи могут авторизоваться и стучаться к твоему API с токенами.

На практике:

  • токены разрастаются пачками, если их не чистить;
  • фронт случайно теряет токен и гонит багрепорт «API не работает»;
  • админы потом просят ротацию токенов, а у тебя её нет;

Тестирование: Postman — твой лучший друг

Да, можно сидеть и гонять curl, но нормальный человек всё равно берёт Postman или Insomnia. Там ты сразу видишь, что твой API возвращает 500-ю ошибку, потому что ты забыл use Illuminate\Http\Request; в контроллере.

И именно тут ты понимаешь, что «базовый REST API» из туториала покрывает процентов 20 твоих реальных задач. Остальное — кастом, костыли, правки под фронт и вечная война с тем, кто придумал отправлять дату в формате dd.mm.yyyy.

Вывод

Сделать API на Laravel — легко. Сделать API, которое выдержит прод, нагрузку и требования бизнеса — больно. Laravel даёт тебе sugar-синтаксис, миграции, роутинг, аутентификацию. Но под капотом всё равно сидит обычный SQL, обычный PHP и обычные баги.

И если ты думаешь, что API в Laravel — это «нажал artisan и всё готово», то жди сюрпризов. Потому что REST API — это не про магию. Это про то, чтобы держать в голове архитектуру, оптимизацию и постоянный контроль.