Halo sobat koder! Masih ngoding kah? Tentunya masih dong...
Nah pada tutorial kali ini kita akan belajar menggunakan model binding pada laravel. Apa sih model binding itu? Jadi pada laravel 5 keatas diperkenalkan fitur baru yaitu Route Model Binding. Fungsi dari route model binding sendiri adalah untuk memudahkan kita dalam melakukan dependency injection suatu model berdasarkan parameter yang dilempar ke route tanpa harus menggunakan id nya. Gampangnya kalo biasanya kita harus melempar id ke route sebagai parameter, kemudian digunakan untuk meretrieve model yang sesuai dengan id tersebut, sekarang sudah bisa menggunakan model binding untuk melempar modelnya langsung ke route. Cukup mempermudah kita yang sering menggunakan CRUD di laravel.
Masih belum paham? Gini nih maksudnya..
buku/24
(dimana 24 adalah id buku). Kemudian pada route atau controller
kita melakukan pencarian ke database menggunakan id
tersebut.
Route::get('buku/{id}', function($id){
$buku = \App\Buku::findOrFail($id);
return view('buku.show', compact('buku'));
});
Nah, cara
tersebut cukup panjang dan kurang efisien, karena kita harus melempar id buku
ke URI, kemudian kita mencocokan id buku ke database, baru kita bisa
mendapatkan modelnya. Oleh karena itu, laravel menciptakan cara yang lebih
mudah, yaitu langsung menggunakan model sebagai parameternya. Nah, untuk
melakukannya, ada beberapa cara yang disediakan oleh laravel, kamu bebas mau
menggunakan yang mana aja sesuai dengan kebutuhan.
Cara 1: Implicit Model Binding
Kita akan
menggunakan contoh diatas, dan mengubahnya menggunakan laravel Route Model
Binding, khususnya implicit model binding. Cara ini menurut saya paling
simpel, jadi kita cukup mengubah parameter id buku menjadi model bukunya saja.
Sehingga koding diatas akan berubah menjadi seperti ini.
Route::get('buku/{buku}', function(\App\Buku $buku){
return view('buku.show', compact('buku'));
});
Dengan cara
diatas, terlihat kalau kodingannya jadi jauh lebih simpel. Kita cukup melemparkan id modelnya
secara langsung ke URI, kemudian pada anonymous function nya kita cukup
mendefinisikan model bukunya. Laravel akan otomatis mencari model yang sesuai
dengan id model dan menampilkannya pada view.
Cara diatas sudah
cukup bagus dan efisien, namun ada kalanya melemparkan id langsung ke URI
adalah bad practices. Hal ini dikarenakan user dapat melihat atau mencoba-coba
id yang lain, yang bahkan mungkin bukan hak mereka untuk melihatnya. Oleh karena
itu disarankan menggunakan atribut unik yang lain, misalkan slug. Nah,
bagaimana kalau kita ingin menggunakan slug untuk dilempar sebagai
parameternya? Misalkan
buku/laskar-pelangi
(dimana
laskar-pelangi merupakan slug dari buku tersebut).
Kita cukup
mendefinisikan fungsi
getRouteKeyName()
pada model yang bersangkutan (dalam hal
ini berarti buku). Nah, kita ubah kodeingan modelnya pada app/Buku.php
. public function getRouteKeyName(){
return 'slug';
}
Dengan begitu
kita akan melemparkan slug ke URI sebagai parameternya secara otomatis. Mudah
kan!
Cara 2: Explicit Model Binding
Dibandingkan cara
pertama, menggunakan laravel explicit model binding terbilang sedikit ribet. Cara
ini mengharuskan kita untuk mendaftarkan route model ke file
app/providers/RouteServiceProvider.php
. Dengan
kasus yang sama seperti diatas, kita akan menambahkan kode pada method boot()
.public function boot()
{
parent::boot();
Route::model('buku', App\Buku::class);
}
Kemudian pada
routes/web.php
kita akan menambahkan
route yang memiliki parameter {buku}
Route::get('buku/{buku}', function (App\Buku $buku) {
//
});
Pada contoh
diatas, kita telah melakukan binding pada semua parameter
{buku}
ke model App\Buku
,
sehingga model Buku
akan otomatis di
inject ke dalam route. Keuntungan lainnya adalah, jika model yang dilempar ke
parameter tidak ditemukan, maka laravel akan otomatis memberikan response 404
not found.
Jika temen temen
ingin menggunakan logika sendiri pada proses pencocokan nilai parameter ke
database, kita bisa menggunakan fungsi
bind()
. Contohnya seperti ini.public function boot()
{
parent::boot();
Route::bind('buku', function ($value) {
return App\Buku::where('name', $value)->first() ?? abort(404);
});
}
Penggunaan pada Controller
Jika temen temen
tidak ingin menggunakan closure pada route, kita bisa memasukan logika pada
controller, sehingga koding jadi lebih rapi. Dengan contoh kasus yang sama
seperti diatas, kita akan menggunakan implicit route binding pada
routes/web.php
Route::get('buku/{buku}', 'BukuController@show');
Kemudian buat
BukuController
dan buat method show()
seperti dibawah:public function show(Buku $buku)
{
return view('buku', compact('buku'));
}
Perhatikan bahwa
method
show()
menggunakan parameter
berupa model, bukan berupa id seperti umumnya. Cukup mudah kan penggunaannya,
selain itu dengan menggunakan model binding juga akan menghemat waktu jika
kalian banyak melakukan CRUD pada aplikasi yang sedang kalian buat.Akhir Kata
Penggunaan route
model binding ini dapat kalian aplikasikan pada aplikasi yang butuh banyak CRUD
didalamnya. Dengan menggunakan route model binding ini juga akan menghemat
waktu dalam proses pembuatannya, selain itu listing kode juga akan menjadi
lebih rapi dan hemat baris.
Jadi, sekian dulu untuk tutorial kali ini, semoga bermanfaat, dan jangan lupa untuk terus ngoding
Jadi, sekian dulu untuk tutorial kali ini, semoga bermanfaat, dan jangan lupa untuk terus ngoding
Laravel Tutorial: Menggunakan Route Model Binding
Reviewed by kodehero
on
December 17, 2017
Rating:
ga jelas penjelasannya
ReplyDelete