Wed Dec 2019 2 years ago

Menggunakan Fitur Route Model Binding (Implicit Binding,Explicit Binding)

#Route Model Binding

Saat menyuntikkan ID model ke tindakan route atau pengontrol, Anda akan sering meminta untuk mengambil model yang sesuai dengan ID itu. Penjilidan model route Laravel menyediakan cara mudah untuk secara otomatis menyuntikkan instance model secara langsung ke route Anda. Misalnya, alih-alih menyuntikkan ID pengguna, Anda dapat menyuntikkan seluruh User contoh model yang cocok dengan ID yang diberikan.

#Binding implisit

Laravel secara otomatis menyelesaikan model Eloquent yang didefinisikan dalam tindakan route atau pengontrol yang nama variabel tipenya cocok dengan nama segmen route. Sebagai contoh:

Route::get('api/users/{user}', function (AppUser $user) {
    return $user->email;
});

Karena $user variabel ditandai sebagai model Eloquent dan nama variabel cocok dengan segmen URI, Laravel akan secara otomatis menyuntikkan instance model yang memiliki ID yang cocok dengan nilai yang sesuai dari URI permintaan. Jika contoh model yang cocok tidak ditemukan dalam database, respons HTTP 404 akan secara otomatis dihasilkan.AppUser{user}

 

#Menyesuaikan Key Name

Jika Anda ingin pengikatan model untuk menggunakan kolom database selain id ketika mengambil kelas model yang diberikan, Anda dapat mengganti getRouteKeyName metode pada model Eloquent:

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

 

#Explicit Binding

Untuk mendaftarkan pengikatan eksplisit, gunakan metode router model untuk menentukan kelas untuk parameter yang diberikan. Anda harus mendefinisikan binding model eksplisit Anda dalam boot metode RouteServiceProvider kelas:

public function boot()
{
    parent::boot();

    Route::model('user', AppUser::class);
}

Selanjutnya, tentukan rute yang berisi parameter:{user}

Route::get('profile/{user}', function (AppUser $user) {
    //
});

Karena kita telah mengikat semua parameter ke model, sebuah instance akan disuntikkan ke dalam rute. Jadi, misalnya, permintaan untuk akan menyuntikkan instance dari database yang memiliki ID .{user}AppUserUserprofile/1User1

Jika contoh model yang cocok tidak ditemukan dalam database, respons HTTP 404 akan dihasilkan secara otomatis.

Menyesuaikan Resolution Logic

Jika Anda ingin menggunakan logika resolusi Anda sendiri, Anda dapat menggunakan metode ini. Anda lolos ke metode akan menerima nilai segmen URI dan harus mengembalikan instance dari kelas yang harus disuntikkan ke rute:Route::bindClosurebind

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Route::bind('user', function ($value) {
        return AppUser::where('name', $value)->first() ?? abort(404);
    });
}

Atau, Anda dapat mengganti resolveRouteBinding metode pada model Eloquent Anda. Metode ini akan menerima nilai segmen URI dan harus mengembalikan instance kelas yang harus disuntikkan ke rute:

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @return IlluminateDatabaseEloquentModel|null
 */
public function resolveRouteBinding($value)
{
    return $this->where('name', $value)->first() ?? abort(404);
}
route laravel route model binding belajar laravel tutorial laravel laravel