21 августа 2024 г.
Установка 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 можно использовать:
Создание новой статьи:
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 готов и протестирован!