Search by

caturseptian / laravel-sluggable

caturseptian

Slug Eloquent yang paham bahasa Indonesia untuk Laravel 6–13, bisa di-eject agar tanpa ketergantungan

Package info

github.com/caturseptian/laravel-sluggable

pkg:composer/caturseptian/laravel-sluggable

Statistics

Installs: 9

Dependents: 0

Suggesters: 0

Stars: 0

v1.0.2 2026-10-14 14:29 UTC

README

tests Packagist Version Packagist Downloads PHP Laravel License Ko-fi Trakteer

English

Membuat slug otomatis saat model Eloquent disimpan, dengan aturan yang paham bahasa Indonesia.

  • Paham Indonesia — PT Bank Rakyat Indonesia (Persero) Tbk → bank-rakyat-indonesia, Kab. Bandung Barat → kabupaten-bandung-barat.
  • Laravel 6 sampai 13 dalam satu paket (PHP 7.2–8.5).
  • Bisa tanpa ketergantungan — pasang saat pengembangan, php artisan sluggable:eject, lalu hapus paketnya.

Instalasi

Mode dependent (paket tetap dipasang)

composer require caturseptian/laravel-sluggable

Pasang di require, bukan require-dev, kecuali Anda akan melakukan eject. Tanpa eject, composer install --no-dev di production membuat aplikasi galat class not found.

Mode eject (tanpa ketergantungan)

composer require --dev caturseptian/laravel-sluggable
php artisan sluggable:eject --dry-run   # lihat file yang akan dibuat/diubah
php artisan sluggable:eject
composer remove caturseptian/laravel-sluggable

Eject menyalin kode ke app/Support/Sluggable (namespace App\Support\Sluggable), mengganti rujukan Caturseptian\Sluggable di folder app, config, database, routes, dan tests, lalu menyertakan LICENSE-sluggable. Rujukan di luar folder itu tidak diubah, tetapi ditampilkan sebagai peringatan. Opsi: --path=, --namespace= (beri tanda kutip, mis. --namespace="Domain\Slug"), --scan= (bisa berulang), --dry-run, --force.

Pemakaian

use Caturseptian\Sluggable\HasSlug;
use Caturseptian\Sluggable\SlugOptions;
use Illuminate\Database\Eloquent\Model;

class Perusahaan extends Model
{
    use HasSlug;

    public function getSlugOptions(): SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('nama')
            ->saveSlugsTo('slug');
    }
}

Migrasi: $table->string('slug')->unique();

Opsi

Metode Keterangan
generateSlugsFrom('judul') / (['judul', 'kota']) / (function ($model) { ... }) sumber slug
saveSlugsTo('slug') kolom tujuan
allowDuplicateSlugs() tanpa suffix keunikan
slugsShouldBeNoLongerThan(100) panjang maksimum (default 250, termasuk suffix)
usingSeparator('_') pemisah (default -)
usingLanguage('de') bahasa transliterasi Str::slug (default en)
doNotGenerateSlugsOnCreate() / doNotGenerateSlugsOnUpdate() matikan pada event tertentu
preventOverwrite() jangan pernah membuat ulang slug yang sudah terisi (slug manual tidak dicek keunikannya)
skipGenerateWhen(function ($model) { return ...; }) lewati kondisi tertentu
extraScope(function ($query) { $query->where('tenant_id', 1); }) keunikan per lingkup
startSlugSuffixFrom(2) suffix pertama (default 1)
indonesian() / indonesian(function ($rules) { ... }) aturan Indonesia

Aturan Indonesia

SlugOptions::create()
    ->generateSlugsFrom('nama')
    ->saveSlugsTo('slug')
    ->indonesian(function ($rules) {
        return $rules
            ->expandAbbreviations()   // Kab. → kabupaten, Jl. → jalan, No. → nomor, ...
            ->dropLegalEntity()       // PT, CV, UD, Tbk, (Persero), Koperasi, Yayasan, ...
            ->dropStopwords();        // dan, di, ke, dari, yang, untuk, ...
    });

indonesian() tanpa argumen hanya memperluas singkatan. Bila aturan menghapus seluruh teks (mis. nama hanya PT), slug dibuat dari teks asli (pt).

Masukan Aturan Slug
PT Bank Rakyat Indonesia (Persero) Tbk dropLegalEntity bank-rakyat-indonesia
Kab. Bandung Barat expandAbbreviations kabupaten-bandung-barat
Jl. Gatot Subroto No. 10 expandAbbreviations jalan-gatot-subroto-nomor-10
Toko Buku dan Alat Tulis dropStopwords toko-buku-alat-tulis

Daftar lengkap ada di src/Indonesian/Dictionary.php.

Di luar model

use Caturseptian\Sluggable\Slug;

Slug::make('Judul Artikel');            // judul-artikel
Slug::indonesia('Kab. Bandung Barat');  // kabupaten-bandung-barat

Slug tidak memeriksa database, jadi tidak menjamin keunikan.

Kompatibilitas

Laravel PHP
6, 7 7.2 / 7.3 – 8.0
8 7.3 – 8.1
9 8.0 – 8.2
10 8.1 – 8.3
11, 12 8.2 – 8.4
13 8.3 – 8.5

Setiap baris diuji di CI.

Pindah dari spatie/laravel-sluggable

Nama metode SlugOptions sama. Ganti use Spatie\Sluggable\... menjadi use Caturseptian\Sluggable\.... Fitur Spatie v4 seperti URL self-healing, slug multibahasa (HasTranslatableSlug), dan atribut #[Sluggable] tidak tersedia di sini — bila Anda membutuhkannya, pakai spatie/laravel-sluggable.

Pengujian

composer test

Kredit

Berawal dari spatie/laravel-sluggable karya Freek Van der Herten dan Spatie. Dikembangkan dan dirawat oleh Tian.

Lisensi

MIT. Lihat LICENSE.md.