Laravel Best Practices dan Design Patterns: Panduan Lengkap Developer Modern
Pendahuluan
Laravel adalah framework PHP paling populer saat ini, tetapi menulis kode yang "jalan" saja tidak cukup. Banyak developer pemula menumpuk logika bisnis di dalam Controller, mengabaikan Service Container, dan membiarkan celah Mass Assignment terbuka. Artikel ini membahas Laravel best practices, design patterns yang praktis, serta analisis keamanan nyata yang bisa langsung Anda terapkan di proyek produksi.
Pembahasan: Design Patterns Esensial di Laravel
Ada beberapa pattern yang wajib dikuasai: Repository Pattern untuk memisahkan akses data, Service Layer untuk logika bisnis, Action Class untuk operasi tunggal, dan Form Request untuk validasi. Prinsip utamanya adalah Single Responsibility—Controller hanya mengatur alur request-response, bukan menjalankan query kompleks atau mengirim email.
Untuk performa, hindari masalah N+1 Query dengan Eager Loading, gunakan Cache untuk data statis, dan manfaatkan Route Cache serta Config Cache saat deployment.
Contoh Implementasi
Berikut pemisahan logika menggunakan Service dan Form Request:
// app/Http/Requests/StoreProductRequest.php
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
'price' => ['required', 'numeric', 'min:0'],
];
}
// app/Services/ProductService.php
class ProductService
{
public function __construct(private ProductRepository $repo) {}
public function create(array $data): Product
{
return $this->repo->store($data);
}
}
// Controller tetap ramping
public function store(StoreProductRequest $request, ProductService $service)
{
$product = $service->create($request->validated());
return response()->json($product, 201);
}
Untuk mengatasi N+1, gunakan eager loading:
// Buruk: memicu N+1 query
$posts = Post::all();
foreach ($posts as $post) { echo $post->author->name; }
// Baik: hanya 2 query
$posts = Post::with('author')->get();
Analisis Keamanan: Celah Mass Assignment
Cara kerja celah: Eloquent mengizinkan mass assignment melalui Model::create($request->all()). Jika model tidak dilindungi, penyerang dapat mengirim field sensitif seperti is_admin atau role ke endpoint registrasi.
Demonstrasi eksploitasi: Misalnya endpoint POST /register menjalankan User::create($request->all()). Penyerang mengirim payload:
POST /register
{
"name": "Attacker",
"email": "[email protected]",
"password": "secret",
"is_admin": true
}
Akibatnya akun baru langsung memiliki hak administrator—privilege escalation yang serius.
Cara Pencegahan
Langkah mitigasi yang harus diterapkan:
- Definisikan
protected $fillable = ['name', 'email', 'password'];pada model, atau gunakanprotected $guarded = ['is_admin', 'role'];. - Selalu gunakan
$request->validated()alih-alih$request->all(). - Jangan pernah mass assign kolom otorisasi.
- Aktifkan proteksi CSRF (default Laravel) dan gunakan Authorization Policy dengan
$this->authorize(). - Terapkan rate limiting pada endpoint sensitif untuk mencegah brute force.
Kesimpulan
Laravel best practices dan design patterns seperti Repository, Service Layer, dan Form Request membuat kode lebih bersih, teruji, dan mudah dipelihara. Untuk performa, eager loading, route cache, dan config cache memberi dampak besar dengan usaha minimum. Untuk keamanan, selalu batasi fillable, gunakan validated(), dan terapkan Policy. Dengan menerapkan pola ini, aplikasi Laravel Anda akan lebih aman, cepat, dan siap produksi.