Тест на вакансию

Создание REST API на PHP фреймворке Laravel

21 августа 2024 г.
117

Установка Laravel

Начнём с установки нового Laravel-проекта с помощью Composer (всё делается в терминале IDE/командной строке):
composer create-project laravel/laravel laravel-api-app
cd laravel-api-app

Настройка базы данных

Далее переходим к настройкам БД (подключаться будем к MySQL), для этого отредактируем файл .env и укажем настройки нашей базы данных (имя базы, имя пользователя, пароль и хост).
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_api_app
DB_USERNAME=your_username
DB_PASSWORD=your_password
Создадим миграцию для таблицы articles:
php artisan make:migration create_articles_table --create=articles
Отредактируем файл миграции (database/migrations/xxxx_xx_xx_create_articles_table.php):
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void
    {
        Schema::dropIfExists('articles');
    }
};

Установка API

Установим API с помощью команды:
php artisan install:api
Выполним миграции:
php artisan migrate

Создание модели Eloquent

php artisan make:model Article
Отредактируем файл модели (app/Models/Article.php):
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;
    protected $fillable = [
        'title',
        'description',
    ];
}

Создание контроллера API

Создадим контроллер API для обработки запросов:
php artisan make:controller ArticleController --api
Этот ключ --api создает контроллер с предопределенными методами для основных операций REST (index, store, show, update, destroy).

Отредактируем файл контроллера (app/Http/Controllers/ArticleController.php):
<?php

namespace App\Http\Controllers;

use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator;

class ArticleController extends Controller
{
    public function index(): JsonResponse
    {
        $Articles = Article::all();
        return response()->json($Articles);
    }
    public function store(Request $request): JsonResponse
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|string|max:255',
            'description' => 'nullable|string',
        ]);
        if ($validator->fails()) {
            return response()->json($validator->errors(), 400);
        }
        $Article = Article::create($validator->validated());
        return response()->json($Article, 201);
    }
    public function show(Article $Article): JsonResponse
    {
        return response()->json($Article);
    }
    public function update(Request $request, Article $Article): JsonResponse
    {
       $validator = Validator::make($request->all(), [
            'title' => 'string|max:255',
            'description' => 'nullable|string',
        ]);
        if ($validator->fails()) {
            return response()->json($validator->errors(), 400);
        }
        $Article->update($validator->validated());
        return response()->json($Article);
    }
    public function destroy(Article $Article): JsonResponse
    {
        $Article->delete();
        return response()->json(null, 204);
    }
}
Ключевые моменты в контроллере:
  • index(): Возвращает список всех статей в формате JSON.
  • store(): Создает новую статью.
    • Использует валидацию (Validator) для проверки входных данных.
    • Возвращает код ответа 400 (Bad Request) в случае ошибок валидации.
    • Возвращает код ответа 201 (Created) при успешном создании ресурса.
  • show(): Возвращает информацию о конкретной статье.
  • update(): Обновляет информацию о статье.
  • destroy(): Удаляет статью.
    • Возвращает код ответа 204 (No Content) при успешном удалении.
Добавление JsonResponse к методам контроллера улучшает читаемость и надежность кода, указывая, что метод должен возвращать JSON-ответ.

Использование Validator для проверки входящих данных делает API более надежным и предотвращает ошибки, вызванные некорректными данными.

Определение маршрутов API

Определим маршруты API в файле routes/api.php:
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ArticleController;

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

Route::apiResource('articles', ArticleController::class);

Тестирование API

Запускаем наш API:
php artisan serve
Сервер запуститься по адресу http://127.0.0.1:8000.

Для тестирования API можно использовать:
  • Postman
  • curl
Создание новой статьи:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Статья №1", "description": "Описание статьи №1"}' http://localhost:8000/api/articles
Получение всех статей:
curl http://localhost:8000/api/articles
Получение статьи (с id = 1):
curl http://localhost:8000/api/articles/1
Обновление статьи (с id = 1):
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Статья №1 (обновление)"}' http://localhost:8000/api/articles/1
Удаление статьи (с id = 1):
curl -X DELETE http://localhost:8000/api/articles/1
Наш API для работы со статьями на фреймворке Laravel готов и протестирован!

 
Поделиться: