Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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 PostResource
namespace 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 с ошибками.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.