Как создать REST API на Laravel?php-75

1. Подготовка проекта

Установите Laravel и необходимые пакеты:

composer create-project laravel/laravel api-project
composer require laravel/sanctum

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

.env конфигурация:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_api
DB_USERNAME=root
DB_PASSWORD=

3. Создание модели и миграции

Генерация ресурса:

php artisan make:model Product -mcr

database/migrations/..._create_products_table.php:

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->text('description');
    $table->decimal('price', 8, 2);
    $table->timestamps();
});

Запустите миграцию:

php artisan migrate

4. Реализация RESTful контроллера

app/Http/Controllers/ProductController.php:

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    // GET /api/products
    public function index()
    {
        return response()->json(Product::all());
    }

    // POST /api/products
    public function store(Request $request)
    {
        $product = Product::create($request->validate([
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'price' => 'required|numeric|min:0'
        ]));

        return response()->json($product, 201);
    }

    // GET /api/products/{id}
    public function show(Product $product)
    {
        return response()->json($product);
    }

    // PUT/PATCH /api/products/{id}
    public function update(Request $request, Product $product)
    {
        $product->update($request->validate([
            'name' => 'sometimes|string|max:255',
            'description' => 'nullable|string',
            'price' => 'sometimes|numeric|min:0'
        ]));

        return response()->json($product);
    }

    // DELETE /api/products/{id}
    public function destroy(Product $product)
    {
        $product->delete();
        return response()->json(null, 204);
    }
}

5. Настройка роутов

routes/api.php:

use App\Http\Controllers\ProductController;

Route::apiResource('products', ProductController::class)
    ->middleware('auth:sanctum');

// Аутентификация
Route::post('/auth/register', [AuthController::class, 'register']);
Route::post('/auth/login', [AuthController::class, 'login']);

6. Реализация аутентификации

app/Http/Controllers/AuthController.php:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string|min:8'
        ]);

        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => Hash::make($validated['password'])
        ]);

        return response()->json([
            'token' => $user->createToken('api-token')->plainTextToken
        ], 201);
    }

    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required'
        ]);

        if (!auth()->attempt($request->only('email', 'password'))) {
            return response()->json(['message' => 'Invalid credentials'], 401);
        }

        return response()->json([
            'token' => auth()->user()->createToken('api-token')->plainTextToken
        ]);
    }
}

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

Пример запросов (cURL):

  1. Регистрация:
curl -X POST http://localhost:8000/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{"name":"User","email":"user@test.com","password":"password"}'
  1. Получение токена:
curl -X POST http://localhost:8000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"user@test.com","password":"password"}'
  1. Создание продукта:
curl -X POST http://localhost:8000/api/products \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{"name":"Laptop","description":"Powerful laptop","price":999.99}'
  1. Получение списка:
curl -X GET http://localhost:8000/api/products \
  -H "Authorization: Bearer YOUR_TOKEN"

8. Дополнительные улучшения

  1. Пагинация:
public function index()
{
    return response()->json(Product::paginate(10));
}
  1. Ресурсы для форматирования:
php artisan make:resource ProductResource
  1. Кеширование:
public function index()
{
    return response()->json(
        Cache::remember('products', 60, fn() => Product::all())
    );
}

Резюмируем:

  1. Структура: Модель → Контроллер → Роуты
  2. Аутентификация: Используйте Sanctum для токенов
  3. Валидация: Всегда валидируйте входящие данные
  4. RESTful: Следуйте принципам REST (ресурсы, HTTP-методы)
  5. Документирование: Используйте Swagger/OpenAPI

Готовый API будет включать:

  • CRUD операции для продуктов
  • JWT-аутентификацию
  • Валидацию данных
  • Пагинацию и кеширование
  • Стандартные HTTP-статусы

Для production-проектов добавьте:

  • Rate limiting
  • Более сложную авторизацию (роли/права)
  • Логирование запросов
  • Тестирование (PHPUnit, Pest)