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
0 Komentar