Jika teman-teman perhatikan pada Model Category dan Product terdapat sebuah slug di dalamnya, slug ini biasanya digunakan untuk membuat URL menjadi lebih friendly atau bagus dibandingkan menggunakan id.
Nah sekarang kita akan menambahkan sebuah mutator di dalam Model, dimana ketika kita melakukan proses create dan edit, maka akan otomatis mengenerate sebuah slug berdasarkan title atau name yang dikirimkan.
Untuk melakukan hal ini, kita akan menggunakan method boot di dalam Model. Jadi apa sebenernya method boot itu ? Method boot() dalam model Laravel adalah bagian dari Lifecycle Hooks di Eloquent, yang memungkinkan kita untuk mengatur perilaku otomatis ketika sebuah event terjadi pada model.
Dalam contoh kali ini, method boot() akan kita gunakan untuk memastikan bahwa slug di-generate secara otomatis berdasarkan name untuk category dan title untuk product sebelum data disimpan ke database.
Langkah 1 - Menambahkan Method Boot di Category
Silahkan teman-teman buka file app/Models/Category.php, kemudian ubah kode-nya menjadi seperti berikut ini.
php
<?php
namespace App\Models;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
/**
* fillable
*
* @var array
*/
protected $fillable = ['image', 'name', 'slug'];
/**
* products
*
* @return void
*/
public function products()
{
return $this->hasMany(Product::class);
}
/**
* boot
*
* @return void
*/
protected static function boot()
{
parent::boot();
// Generate slug before saving
static::saving(function ($category) {
if (empty($category->slug)) {
$category->slug = Str::slug($category->name);
}
});
}
}
Dari perubahan kode di atas, pertama kita import Str dari Laravel.
perl
use Illuminate\Support\Str;
Kemudian kita membuat method baru dengan nama boot dan di dalamnya kita gunakan helper Str::slug untuk mengenerate slug berdasarkan name category.
php
protected static function boot()
{
parent::boot();
// Generate slug before saving
static::saving(function ($category) {
if (empty($category->slug)) {
$category->slug = Str::slug($category->name);
}
});
}
Langkah 2 - Menambahkan Method Boot di Product
Kita lakukan hal yang sama di dalam model Product. Silahkan teman-teman buka file app/Models/Product.php, kemudian ubah kode-nya menjadi seperti berikut ini.
php
<?php
namespace App\Models;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
/**
* fillable
*
* @var array
*/
protected $fillable = [
'category_id',
'image',
'title',
'slug',
'description',
'price',
'weight'
];
/**
* category
*
* @return void
*/
public function category()
{
return $this->belongsTo(Category::class);
}
/**
* ratings
*
* @return void
*/
public function ratings()
{
return $this->hasMany(Rating::class);
}
/**
* boot
*
* @return void
*/
protected static function boot()
{
parent::boot();
// Generate slug before saving
static::saving(function ($product) {
if (empty($product->slug)) {
$product->slug = Str::slug($product->title);
}
});
}
}
Untuk penjelasannya sama seperti yang ada di Category di atas.