Laravel API
Priority: P1 (HIGH)
Workflow: Create a New API Endpoint
- Generate resource —
php artisan make:resource UserResource. - Define toArray() — Specify exact output fields; never return raw models.
- Add route — Register in
routes/api.phpwith version prefix and throttle middleware. - Secure with Sanctum — Apply
auth:sanctummiddleware to protected routes. - Return proper status codes — 201 for Created, 422 for Validation, 204 for No Content.
API Resource Example
See implementation examples for a complete API Resource with collection usage.
Implementation Guidelines
API Resources & Transformation
- API Resources: Always use
ApiResourceclasses extendingJsonResourcefor data transformation. - Collections: Use
UserResource::collection($users)for lists. Never useresponse()->json($model)or return raw models directly. - Data Definition: Implement
toArray($request)to define specific output fields and prevent sensitive data leakage. - Generation: Use
php artisan make:resource UserResourceto scaffold new resources.
Authentication & Security
- Sanctum: Use
auth:sanctummiddleware inroutes/api.phpfor SPAs or mobile app authentication. - Traits: Add the
HasApiTokenstrait to yourUsermodel to enable token-based authentication. - Token Management: Issue tokens using
$user->createToken('token-name')->plainTextToken. - OAuth2: Use Passport only if standard OAuth2 flows or client grants are required.
Routing & Performance
- Versioning: Group routes with
Route::prefix('v1')->group(...)and use versioned namespaces (e.g.,App\Http\Controllers\Api\V1). - Rate Limiting: Define
RateLimiter::for('api', ...)usingLimit::perMinute(60)inAppServiceProvider. - Middleware: Apply the
throttle:apimiddleware to route groups inroutes/api.php. - Status Codes: Return 201 for Created, 422 for Validation errors, and 204 for No Content.
Anti-Patterns
- No raw model returns: Use API Resources; prevents data leakage.
- No
response()->json(): Use API Resource classes instead. - No session auth for APIs: Use Sanctum or Passport tokens.
- No static URLs in JSON: Use route names or HATEOAS links.