API
Мобильному приложению или интерфейсу на React нужны не HTML-страницы, а данные в формате JSON. Laravel возвращает JSON почти без дополнительного кода: модель, отданная из контроллера, превращается в него сама.
Маршруты API
В новых версиях Laravel файл маршрутов API создаёт команда:
php artisan install:apiОна добавит файл routes/api.php. Все адреса из него начинаются с /api:
use App\Http\Controllers\Api\PostController;
use Illuminate\Support\Facades\Route;
Route::apiResource('posts', PostController::class);apiResource регистрирует пять маршрутов: список, просмотр, создание, изменение и удаление.
Контроллер
php artisan make:controller Api/PostController --apiМодель или коллекция, возвращённая из метода, автоматически становится JSON:
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Post;
class PostController extends Controller
{
public function index()
{
return Post::latest()->paginate(20);
}
public function show(Post $post)
{
return $post;
}
}Параметр Post $post — привязка модели к маршруту: Laravel сам найдёт запись по идентификатору из адреса или вернёт 404.
Создание записи
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
$post = Post::create($data);
return response()->json($post, 201);
}Код 201 означает «создано». Если проверка не пройдена, клиент API получит ответ с кодом 422 и списком ошибок в JSON — редиректа на форму не будет.
API-ресурсы
Отдавать модель целиком неудобно: в ответ попадут все столбцы, включая служебные. Ресурс описывает, что именно увидит клиент:
php artisan make:resource PostResourcenamespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'published_at' => $this->created_at->toDateString(),
];
}
}return new PostResource($post);
return PostResource::collection(Post::paginate(20));Удаление
public function destroy(Post $post)
{
$post->delete();
return response()->noContent();
}noContent() отправляет код 204 — «выполнено, тела ответа нет».
Аутентификация
Команда install:api ставит пакет Sanctum. Клиент присылает токен в заголовке Authorization, а маршруты защищают посредником:
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('posts', PostController::class)->except(['index', 'show']);
});Частая ошибка
Клиент должен присылать заголовок Accept: application/json. Без него Laravel считает запрос обычным и при ошибке проверки вернёт перенаправление вместо JSON с ошибками.