Model Binding di Laravel


Pada Laravel versi 5.*, diperkenalkan sebuah fitur baru dengan nama Routing Model Binding. Model Binding memungkinkan kita melakukan dependecy injection pada model berdasarkan parameter yang dilempar. Sebagai bawaan, parameter yang digunakan adalah id.

Contoh Kasus

Untuk menampilkan profil user, umumnya kita mendapatkan parameter dari request URI, misal profile/user/1. Kemudian, melakukan pencarian dalam basisdata menggunakan model bersangkutan berdasarkan request tersebut.

Route::get('user/profile/{id}', function($id){
    $user = \App\User::findOrFail($id);
    return view('user.profile', compact('user'));
});

Cara ini tidaklah salah, hanya saja, Laravel menyediakan cara yang lebih efektif dan singkat untuk digunakan.

Model Binding (Implicit)

Dengan kasus yang sama, kita ingin menampilkan data user ke view. Bedanya, jika pada contoh di atas kita menambahkan sendiri kode pencarian menggunakan model user, kali ini biarkan sistem Laravel yang melakukan tugas tersebut. Sehingga, kode di atas dapat ditulis menjadi:

Route::get('user/profile/{user}', function(\App\User $user){
   return view('user.profile', compact('user'));
});

Perhatikan pada anonymous function di atas. Saya menambahkan dependecy injection berupa model user, alih-alih menggunakan parameter id.

Di belakang layar, Laravel otomatis melakukan pencarian ke tabel user berdasarkan parameter id yang tertera pada URI.

Bagaimana jika saya ingin menggunakan parameter username dibandingkan dengan parameter id? Semisal, URI-nya berbentuk user/profile/laravel.

Mengubah Key Name

Untuk kasus ini, kita perlu mengubah key name yang akan digunakan dengan menambah beberapa baris kode pada berkas model app\User.php.

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'username';
}

Model Binding (Explicit)

Jika pada contoh di atas menggunakan implicit binding, contoh berikutnya adalah explicit binding. Cara ini sedikit lebih merepotkan dibanding dengan implicit binding. Karena kita harus mendaftarkannya pada berkas app\Providers\RouteServiceProvider.php.

Pada method boot(), tambahkan definisi model binding.

public function boot()
{
    parent::boot();
    Route::model('user', App\User::class);
}

Selanjutnya, kita tinggal mendefinisikan route yang mengandung parameter {user}. Sebagai contoh:

Route::get('profile/{user}', function(\App\User $user){
 
});

Impelementasi pada Controller

Tak hanya dapat digunakan pada closure route, model binding juga dapat diimplementasikan pada controller. Berikut persiapannya.

Route

Route::get('user/profile/{user}', 'UserController@profile');

Controller

<?php
namespace App\Http\Controllers;
use App\User;
/**
 * @author Yugo <dedy.yugo.purwanto@gmail.com>
 * @copyright Laravel.web.id - 2016
 */
class PasswordController extends Controller
{
    public function profile(User $user)
    {
        return view('user.profile', compact('user'));
    }
}

Tidak berbeda jauh bukan cara yang digunakan? 😉

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan