ساخت 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: چکلیست.