NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Sluggable for Laravel

Ú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áciaSprávanie
Vytvorenie, prázdna hodnotaVygeneruje 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, NeverNič, ani pri prázdnej hodnote.
Úprava, IfEmpty (predvolené)Doplní prázdnu hodnotu alebo chýbajúce jazyky; existujúce hodnoty nikdy nemení.
Úprava, WhenSourceChangesPrepočíta sa pri zmene zdrojového atribútu (pri jazykových mapách po jazykoch).
Úprava, AlwaysPrepočí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 class

withoutGeneration() 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 kryptomien

Odoslaní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.