Установите Laravel и необходимые пакеты:
composer create-project laravel/laravel api-project
composer require laravel/sanctum
.env
конфигурация:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_api
DB_USERNAME=root
DB_PASSWORD=
Генерация ресурса:
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
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);
}
}
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']);
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
]);
}
}
Пример запросов (cURL):
curl -X POST http://localhost:8000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"name":"User","email":"user@test.com","password":"password"}'
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"user@test.com","password":"password"}'
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}'
curl -X GET http://localhost:8000/api/products \
-H "Authorization: Bearer YOUR_TOKEN"
public function index()
{
return response()->json(Product::paginate(10));
}
php artisan make:resource ProductResource
public function index()
{
return response()->json(
Cache::remember('products', 60, fn() => Product::all())
);
}
Готовый API будет включать:
Для production-проектов добавьте: