Membangun REST API dengan Laravel 11: Panduan Lengkap
Laravel 11 menyederhanakan banyak aspek pengembangan API. Mari kita bangun REST API lengkap dengan autentikasi dan best practices.
Setup Project
composer create-project laravel/laravel api-project
cd api-project
php artisan install:api
Langkah 1: Buat Model dan Migration
php artisan make:model Article -mfcr
Edit migration:
// database/migrations/xxxx_create_articles_table.php
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title');
$table->string('slug')->unique();
$table->text('excerpt');
$table->longText('content');
$table->string('cover_image')->nullable();
$table->boolean('is_published')->default(false);
$table->timestamp('published_at')->nullable();
$table->timestamps();
});
}
Langkah 2: Setup Model dengan Fillable dan Relations
// app/Models/Article.php
class Article extends Model
{
use HasFactory;
protected $fillable = [
'title', 'slug', 'excerpt', 'content',
'cover_image', 'is_published', 'published_at',
];
protected $casts = [
'is_published' => 'boolean',
'published_at' => 'datetime',
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
// Auto-generate slug dari title
protected static function boot()
{
parent::boot();
static::creating(function ($article) {
$article->slug = Str::slug($article->title);
});
}
}
Langkah 3: Buat Form Request untuk Validasi
php artisan make:request StoreArticleRequest
// app/Http/Requests/StoreArticleRequest.php
class StoreArticleRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'excerpt' => 'required|string|max:500',
'content' => 'required|string',
'cover_image' => 'nullable|url|max:500',
'is_published' => 'boolean',
];
}
}
Langkah 4: Controller dengan Resource Pattern
// app/Http/Controllers/ArticleController.php
class ArticleController extends Controller
{
public function index(Request $request)
{
$articles = Article::when($request->search, function ($q, $search) {
$q->where('title', 'like', "%{$search}%");
})
->where('is_published', true)
->latest()
->paginate(15);
return ArticleResource::collection($articles);
}
public function store(StoreArticleRequest $request)
{
$article = $request->user()->articles()->create(
$request->validated()
);
return new ArticleResource($article);
}
public function show(Article $article)
{
return new ArticleResource($article);
}
public function update(UpdateArticleRequest $request, Article $article)
{
$this->authorize('update', $article);
$article->update($request->validated());
return new ArticleResource($article);
}
public function destroy(Article $article)
{
$this->authorize('delete', $article);
$article->delete();
return response()->json(['message' => 'Article deleted']);
}
}
Langkah 5: Autentikasi dengan Sanctum
// routes/api.php
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('articles', ArticleController::class);
Route::post('/logout', [AuthController::class, 'logout']);
});
Langkah 6: API Resource untuk Response Format
// app/Http/Resources/ArticleResource.php
class ArticleResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'excerpt' => $this->excerpt,
'content' => $this->content,
'cover_image' => $this->cover_image,
'is_published' => $this->is_published,
'author' => $this->user->name,
'published_at' => $this->published_at?->toISOString(),
'created_at' => $this->created_at->toISOString(),
];
}
}
Best Practices Keamanan
- Selalu gunakan Form Request untuk validasi input
- Gunakan Policy untuk authorization
- Rate limiting sudah built-in di Laravel 11
- Hindari mass assignment — selalu definisikan
$fillable - Gunakan API Resources agar tidak expose data sensitif
- Encrypt sensitive data yang disimpan di database
Kesimpulan
Laravel 11 memberikan fondasi yang kuat untuk membangun REST API. Dengan Sanctum, Form Requests, dan API Resources, API Anda akan aman dan terstruktur dengan baik.