مقاله

معماری API در Laravel 12: routes/api.php، Sanctum، Controller نازک، Resource و استاندارد JSON — راهنمای عملی فول‌استک.

ساخت REST API با Laravel 12 — از صفر تا production

ساخت REST API با Laravel 12 — از صفر تا production

REST API لاراول درخواست‌های زیادی دارد — اپ موبایل، SPA جدا، یکپارچه با سرویس ثالث. Laravel 12 برای این کار ساخته شده: routing جدا در routes/api.php، Sanctum برای auth، و API Resource برای JSON تمیز. این مقاله نقشه راه از اولین endpoint تا الگوی production است.

اصول REST که در Laravel رعایت می‌کنیم

  • منبع (resource) با URL اسم‌گذاری می‌شود: /posts نه /getPosts
  • HTTP verb معنی دارد: GET خواندن، POST ایجاد، PUT/PATCH به‌روزرسانی، DELETE حذف
  • پاسخ JSON با status code معنادار
  • stateless — هر request با token/credential

ساختار پوشه پیشنهادی

app/Http/Controllers/Api/V1/PostController.php
app/Http/Requests/Api/StorePostRequest.php
app/Http/Resources/PostResource.php
app/Services/PostService.php

منطق در Service — اصول Laravel.

routes/api.php

use App\Http\Controllers\Api\V1\PostController;

Route::prefix('v1')->group(function () {
    Route::middleware('auth:sanctum')->group(function () {
        Route::apiResource('posts', PostController::class);
    });
    Route::get('posts', [PostController::class, 'index']);
    Route::get('posts/{post:slug}', [PostController::class, 'show']);
});

خواندن عمومی، نوشتن با auth — Policy در controller.

Controller نمونه

public function index(Request $request)
{
    $posts = Post::query()
        ->published()
        ->with(['category', 'user'])
        ->latest('published_at')
        ->paginate($request->integer('per_page', 15));

    return PostResource::collection($posts);
}

public function store(StorePostRequest $request)
{
    $post = $this->postService->create($request->validated());
    return new PostResource($post);
}

Form Request برای API

public function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json([
        'message' => 'Validation failed.',
        'errors' => $validator->errors(),
    ], 422));
}

تنظیمات

prefix /api خودکار در bootstrap. Rate limiting:

RateLimiter::for('api', fn ($request) => Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()));

تست API

Postman collection + Pest:

it('lists published posts', function () {
    Post::factory()->published()->count(3)->create();
    $this->getJson('/api/v1/posts')->assertOk()->assertJsonCount(3, 'data');
});

موضوعات مرتبط

جمع‌بندی

API Laravel = route + Sanctum + Resource + Service + test. قبل از launch: چک‌لیست.

API سفارشی