Paket ini memberikan sifat yang akan menghasilkan slug unik saat menyimpan model Eloquent apa pun.
$model = new EloquentModel();$model->name = 'activerecord luar biasa';$model->save();echo $model->slug; // menampilkan "catatan aktif-sangat-luar biasa"
Siput dihasilkan dengan metode Laravels Str::slug
, di mana spasi diubah menjadi '-'.
Spatie adalah agen desain web yang berbasis di Antwerp, Belgia. Anda akan menemukan ikhtisar semua proyek sumber terbuka kami di situs web kami.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui composer:
komposer membutuhkan spatie/laravel-sluggable
Model Eloquent Anda harus menggunakan sifat SpatieSluggableHasSlug
dan kelas SpatieSluggableSlugOptions
.
Sifat tersebut berisi metode abstrak getSlugOptions()
yang harus Anda implementasikan sendiri.
Migrasi model Anda harus memiliki bidang untuk menyimpan slug yang dihasilkan.
Berikut ini contoh cara menerapkan sifat tersebut:
Aplikasi namespace; gunakan SpatieSluggableHasSlug; gunakan SpatieSluggableSlugOptions; gunakan IlluminateDatabaseEloquentModel; kelas YourEloquentModel memperluas Model {use HasSlug;/** * Dapatkan opsi untuk menghasilkan slug. */fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->saveSlugsTo('siput'); } }
Dengan migrasinya:
gunakan IlluminateDatabaseMigrationsMigration; gunakan IlluminateDatabaseSchemaBlueprint; gunakan IlluminateSupportFacadesSchema; kelas CreateYourEloquentModelTable memperluas Migrasi {fungsi publik naik() { Skema::buat('your_eloquent_models', function (Cetak Biru $tabel) {$tabel->peningkatan('id');$tabel->string('slug'); // Nama bidang sama dengan `saveSlugsTo`$tabel Anda ->string('nama');$tabel->cap waktu(); }); } }
Untuk menggunakan slug yang dihasilkan dalam rute, ingatlah untuk menggunakan pengikatan model rute implisit Laravel:
Aplikasi namespace; gunakan SpatieSluggableHasSlug; gunakan SpatieSluggableSlugOptions; gunakan IlluminateDatabaseEloquentModel; kelas YourEloquentModel memperluas Model {use HasSlug;/** * Dapatkan opsi untuk menghasilkan slug. */fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->saveSlugsTo('siput'); }/** * Dapatkan kunci rute untuk model tersebut. * * @return string */fungsi publik getRouteKeyName() {kembalikan 'siput'; } }
Ingin menggunakan beberapa bidang sebagai dasar slug? Tidak masalah!
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() ->generateSlugsFrom(['nama_pertama', 'nama_belakang']) ->saveSlugsTo('siput'); }
Anda juga dapat meneruskan callable
ke generateSlugsFrom
.
Secara default paket akan menghasilkan slug unik dengan menambahkan '-' dan nomor, ke slug yang sudah ada.
Anda dapat menonaktifkan perilaku ini dengan allowDuplicateSlugs
.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->allowDuplikatSlugs(); }
Anda juga dapat memberi batas ukuran maksimum pada siput yang dibuat:
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->siputSeharusnyaTidak Lebih PanjangDari(50); }
Siputnya mungkin sedikit lebih panjang dari nilai yang ditentukan, karena sufiks yang ditambahkan untuk membuatnya unik.
Anda juga dapat menggunakan pemisah khusus dengan memanggil usingSeparator
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->menggunakanSeparator('_'); }
Untuk mengatur bahasa yang digunakan oleh Str::slug
Anda dapat memanggil usingLanguage
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->menggunakanBahasa('nl'); }
Anda juga dapat mengganti slug yang dihasilkan hanya dengan mengaturnya ke nilai lain selain slug yang dihasilkan.
$model = EloquentModel::create(['nama' => 'nama saya']); //slug sekarang menjadi "nama-saya";$model->slug = 'url-kustom-saya';$model->save(); //slug sekarang menjadi "url-kustom-saya";
Jika Anda tidak ingin membuat slug saat model memiliki status, Anda dapat menggunakan fungsi skipGenerateWhen
.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->skipGenerateWhen(fn() => $this->state === 'draft'); }
Jika Anda tidak ingin membuat slug saat model pertama kali dibuat, Anda dapat mengatur penggunaan fungsi doNotGenerateSlugsOnCreate()
.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->doNotGenerateSlugsOnCreate(); }
Demikian pula, jika Anda ingin mencegah slug diperbarui pada pembaruan model, panggil doNotGenerateSlugsOnUpdate()
.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->doNotGenerateSlugsOnUpdate(); }
Ini dapat berguna untuk membuat tautan permanen yang tidak berubah sampai Anda secara eksplisit menginginkannya.
$model = EloquentModel::create(['nama' => 'nama saya']); //slug sekarang menjadi "nama-saya";$model->save();$model->name = 'nama yang diubah';$model->save(); //siput tetap "namaku"
Jika Anda ingin memperbarui slug pada model secara eksplisit, Anda dapat memanggil generateSlug()
pada model Anda kapan saja untuk membuat slug sesuai dengan opsi Anda yang lain. Jangan lupa save()
modelnya untuk terus memperbarui database Anda.
Anda dapat mencegah siput ditimpa.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->mencegah Penimpaan(); }
Jika Anda memiliki cakupan global yang harus diperhitungkan, Anda juga dapat mendefinisikannya dengan extraScope
. Misalnya jika Anda memiliki tabel halaman yang berisi halaman beberapa situs web dan setiap situs web memiliki siput uniknya sendiri.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
Secara default, indeks akhiran dimulai dari 1, Anda dapat mengatur nomor awal.
fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->simpanSlugsKe('siput') ->startSlugSuffixFrom(2); }
Anda dapat menggunakan paket ini bersama dengan laravel-translatable untuk menghasilkan slug untuk setiap lokal. Daripada menggunakan sifat HasSlug
, Anda harus menggunakan sifat HasTranslatableSlug
, dan menambahkan nama bidang slug ke array $translatable
. Untuk slug yang dihasilkan dari satu atau beberapa bidang, Anda tidak perlu mengubah apa pun.
Aplikasi namespace; gunakan SpatieSluggableHasTranslatableSlug; gunakan SpatieSluggableSlugOptions; gunakan SpatieTranslatableHasTranslations; gunakan IlluminateDatabaseEloquentModel; kelas YourEloquentModel memperluas Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Dapatkan opsi untuk menghasilkan slug. */fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->saveSlugsTo('siput'); } }
Untuk slug yang dihasilkan dari callable, Anda perlu membuat instance SlugOptions
dengan metode createWithLocales
. Callable sekarang membutuhkan dua argumen, bukan satu. Baik $model
dan $locale
tersedia untuk menghasilkan slug.
Aplikasi namespace; gunakan SpatieSluggableHasTranslatableSlug; gunakan SpatieSluggableSlugOptions; gunakan SpatieTranslatableHasTranslations; gunakan IlluminateDatabaseEloquentModel; kelas YourEloquentModel memperluas Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Dapatkan opsi untuk menghasilkan slug. */fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {kembali "{$locale} {$model->id}"; }) ->saveSlugsTo('siput'); } }
Anda juga dapat menggunakan pengikatan model rute implisit Laravel di dalam pengontrol Anda untuk menyelesaikan model secara otomatis. Untuk menggunakan fitur ini, pastikan kolom slug cocok dengan routeNameKey
.
Saat ini, hanya beberapa tipe database yang mendukung operasi JSON. Informasi lebih lanjut tentang database mana yang mendukung JSON dapat ditemukan di dokumen Laravel.
Aplikasi namespace; gunakan SpatieSluggableHasSlug; gunakan SpatieSluggableSlugOptions; gunakan IlluminateDatabaseEloquentModel; kelas YourEloquentModel memperluas Model {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Dapatkan opsi untuk menghasilkan slug. */fungsi publik getSlugOptions() : SlugOptions{return SlugOptions::create() -> hasilkanSlugsFrom('nama') ->saveSlugsTo('siput'); }/** * Dapatkan kunci rute untuk model tersebut. * * @return string */fungsi publik getRouteKeyName() {kembalikan 'siput'; } }
Untuk kenyamanan, Anda bisa menggunakan alias findBySlug
untuk mengambil model. Kueri akan dibandingkan dengan bidang yang diteruskan ke saveSlugsTo
saat menentukan SlugOptions
.
$model = Artikel::findBySlug('artikel-saya');
findBySlug
juga menerima parameter kedua $columns
seperti metode find
Eloquent default.
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
tes komposer
Silakan lihat KONTRIBUSI untuk rinciannya.
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Freek Van der Herten
Semua Kontributor
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.