Halo teman-teman, kembali lagi kita di web santrikoding. Pada artikel kali ini, kita akan membahas tentang laravel route binding. Apa itu laravel route binding? Yuk kita bahas langsung.
Definisi
Laravel memiliki banyak sekali magic didalam nya. Salah satu nya route binding ini. Tapi, apa maksudnya ya ? Maksudnya adalah kita bisa membind/parsing model melalui routing. Jadi, dengan memparsing model melalui routing, kita juga bisa langsung sekaligus mengambil data yang kita mau ambil data nya tanpa harus membuat query builder nya lagi. Bagaimana ya cara nya?
Contoh kasus
Misalnya kita mempunyai module user management dimana terdapat fitur menampilkan list user, tambah user, menampilkan detail user & edit user.
Route::get("/users", [UserController::class, "index"]);
Lalu pada controller kita menuliskan seperti ini
public function index()
{
$data = [
"users" => User::paginate(10)
];
return view("users.index", $data);
}
Dan kode pada view kita seperti ini
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Email</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@forelse ($users as $user)
<tr>
<td>{{ $loop->index }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>
<a href="/users/{{ $user->id }}">Detail</a>
</td>
</tr>
@empty
<tr>
<td colspan="4">No Data Found</td>
</tr>
@endforelse
</tbody>
</table>
{{ $users->links() }}
</div>
</div>
</div>
@endsection
Maka, hasil yang kita dapatkan seperti ini
Terlihat sama seperti biasa ya? Ya, memang begitulah sifat Laravel kode nya simple namun sangat powerfull fiturnya :D
Sekarang, kita fokus link untuk menuju ke halaman detail nya. Kode untuk menuju ke halaman detail masih sama seperti biasa, yaitu
<a href="/users/{{ $user->id }}">Detail</a>
Lalu pada route, kita buat seperti ini
Route::get("/users/{user_id}", [UserController::class, "show"]);
Dan pada controller, kita buat seperti ini
public function show($id)
{
$data = [
"user" => User::findOrFail($id)
];
return view("users.show", $data);
}
Maka, hasilnya akan seperti ini
Hasil masih normal, namun kita lihat pada kode controller kita
public function show($id)
{
$data = [
"user" => User::findOrFail($id)
];
return view("users.show", $data);
}
Dari kode diatas, kita bisa singkat lagi. Bagaimana cara nya? Cara nya adalah dengan menggunakan Route Bind.
Refaktor Kode
Mari kita refaktor kode nya agar terlihat lebih clean lagi. Pertama, kita ubah route controller kita menjadi seperti ini
Route::get("/users/{user}", [UserController::class, "show"]);
Dari kode diatas, kita mengubah pada kurung kurawal {user} yang sebelumnya adalah {user_id}, lalu pada controller kita buat seperti ini.
public function show(User $user)
{
return view("users.show", \compact("user"));
}
Pada controller diatas, kita ubah pada parameter show(). Sebelum nya kita hanya membuat parameter dengan variable $id saja yang dimana variable $id ini akan menerima nilai ID dari user. Sekarang kita ubah dengan membinding model User dan kita simpan kedalam variable $user.
Important!
Parameter pada route harus sama nama nya dengan variable yang di isikan pada controller. Jika pada route menggunakan {user_id} dan di controller menggunakan $user, maka route model binding tidak akan bekerja
Lalu kita tinggal parsing data nya ke view melalui method compact(). Maka hasil yang kita dapatkan adalah
Yap, hasilnya sama saja namun kode yang kita buat menjadi lebih ringkas. Dengan menggunakan kode ini pun sudah termasuk seperti menggunakan eloquent findOrFail() dimana jika ada ID yang belum ada, maka akan redirect kehalaman 404. Contoh kita mengunjungi url
http://127.0.0.1:8000/users/1000
Dimana user dengan ID 1000 ini belum ada, jika kita kunjungi maka akan mendapatkan halaman 404
Kesimpulan
Route model bind adalah cara kita membuat routing dimana dengan langsung membinding model pada parameter controller kita. Tujuan nya adalah agar kita dapat langsung mengambil data tanpa harus menggunakan query builder kembali.
Oke mungkin cukup segitu saja untuk seri Laravel Tips & Trik route model bind ini ya gais, nantikan tips & trik lain nya hanya di website Santrikoding.com