Úpravy, ručné hodnoty a zámky
Každá definícia určuje, čo sa stane pri vytvorení, pri úprave a keď používateľ zadá vlastný slug:
| Situácia | Správanie |
|---|---|
| Vytvorenie, prázdna hodnota | Vygeneruje sa zo zdrojov; pri prázdnom zdroji rozhoduje EmptySourcePolicy (predvolene Random). |
| Ručná hodnota (vytvorenie alebo zmena) | Normalize (predvolené): hodnota prejde pipeline a stane sa jedinečnou — ak z nej po normalizácii nič nezostane, považuje sa za prázdnu (vygeneruje sa alebo vymaže). Verbatim: bajty sa zachovajú, hodnota sa urobí jedinečnou. Strict: bajty sa zachovajú; ak je hodnota obsadená, vyhodí sa SlugAlreadyTakenException. |
| Úprava, Never | Nič, ani pri prázdnej hodnote. |
| Úprava, IfEmpty (predvolené) | Doplní prázdnu hodnotu alebo chýbajúce jazyky; existujúce hodnoty nikdy nemení. |
| Úprava, WhenSourceChanges | Prepočíta sa pri zmene zdrojového atribútu (pri jazykových mapách po jazykoch). |
| Úprava, Always | Prepočíta sa pri každej úprave. |
| lockWhen() vráti true / locked() | Žiadna automatická zmena; ručná zmena vyhodí SlugLockedException (obídenie: Slugs::unlocked(fn () => …)). |
| Zmena stĺpca rozsahu / obnovenie s excludeTrashed() | Znovu overí jedinečnosť; doplní nový sufix (pri Strict vyhodí výnimku). |
Prepočítaný slug nahradí aktuálny, len ak sa zmenil jeho základ: z chair-2 sa nikdy zbytočne nestane chair-3. Základ určujú uložené zdroje, nie tvar slugu — premenovanie Room 101 na Room dá room (alebo room-2), nikdy zastaraný room-101. Explicitný prepočet (recompute(), regenerateSlugs(), --mode=stale) navyše odstráni sufix, ak je holý základ opäť voľný. Hodnoty Verbatim a Strict s medzerami, riadiacimi znakmi, /, ?, # alebo % a bodkové segmenty . a .. sa odmietnu.
Nastavenie pravidiel
use RoundlyConsulting\Sluggable\Enums\EmptySourcePolicy;
use RoundlyConsulting\Sluggable\Enums\ManualSlugPolicy;
use RoundlyConsulting\Sluggable\Enums\UpdatePolicy;
SlugDefinition::for('slug')
->from('title')
->onUpdate(UpdatePolicy::WhenSourceChanges) // or ->regenerateOnUpdate()
->manual(ManualSlugPolicy::Strict) // taken values throw SlugAlreadyTakenException
->whenEmptySource(EmptySourcePolicy::Fail) // or Random (default) / Skip
->lockWhen(fn (Post $post): bool => $post->is_published)
->skipWhen(fn (Post $post): bool => $post->is_imported);
SlugDefinition::for('handle')->from('name')->immutable(); // = onUpdate(UpdatePolicy::Never)
SlugDefinition::for('code')->from('sku')->locked(); // never changes automatically- onUpdate() — UpdatePolicy::Never, IfEmpty (predvolené), WhenSourceChanges alebo Always. immutable() je skratka pre Never, regenerateOnUpdate() pre WhenSourceChanges.
- WhenSourceChanges pri jazykových mapách prepočítava po jazykoch; zdroje cez closure a cesty cez relácie sa vždy považujú za zmenené.
- manual() — ManualSlugPolicy::Normalize (predvolené), Verbatim alebo Strict.
- whenEmptySource() — EmptySourcePolicy::Random (predvolené: náhodný slug s dĺžkou randomLength znakov), Skip alebo Fail (SlugGenerationException).
- lockWhen() / locked() slug zmrazia; skipWhen() preskočí stĺpec pri jednom uložení; onCreate(false) vypne generovanie pri vytvorení.
Pozastavenie, vynútenie a obídenie
use RoundlyConsulting\Sluggable\Enums\RegenerationMode;
use RoundlyConsulting\Sluggable\Facades\Slugs;
Slugs::withoutGeneration(fn () => Product::factory()->count(500)->create()); // imports
Product::withoutSlugGeneration(fn () => /* … */ null);
Slugs::unlocked(fn () => $post->update(['slug' => 'fixed-typo'])); // bypass locks
Slugs::recompute($product, columns: ['slug']); // recompute from the sources; you save
$product->regenerateSlugs(columns: ['slug'])->save(); // the same from the model side
Slugs::regenerate($product, columns: ['slug']); // recompute + save
Slugs::apply($product); // run the save-time pass now (before saveQuietly/imports)
Slugs::model(Product::class)->regenerate(mode: RegenerationMode::Missing); // back-fill a whole classwithoutGeneration() vypne hooky — a s nimi aj eventy a históriu; dá sa vnárať a je bezpečné pri výnimke. Hooky bežia v creating/updating, takže insert()/upsert() cez query builder, saveQuietly() a withoutEvents() negenerujú nič: najprv zavolajte Slugs::apply($model). Ani save() bez zmien slug nedoplní, pretože Laravel spúšťa updating len pri zmenených modeloch — použite regenerateSlugs(), Slugs::model(X::class)->regenerate() alebo sluggable:regenerate --mode=missing.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.