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

Definície slugov

Prepíšte slugOptions() a deklarujte jeden alebo viac slugových stĺpcov. Každá SlugDefinition je fluentný builder; každá nenastavená voľba preberie predvolenú hodnotu z konfigurácie:

use RoundlyConsulting\Sluggable\Definitions\SlugDefinition;
use RoundlyConsulting\Sluggable\Definitions\SlugOptions;
use RoundlyConsulting\Sluggable\Enums\UpdatePolicy;

public function slugOptions(): SlugOptions
{
    return SlugOptions::make(
        SlugDefinition::for('slug')
            ->from('name')
            ->uniqueWithin('clinic_id')
            ->onUpdate(UpdatePolicy::WhenSourceChanges)
            ->keepHistory()
            ->routeKey(),
        SlugDefinition::for('handle')
            ->from(['brand.name', 'name'])       // relation dot path + attribute
            ->separator('_')
            ->maxLength(40)
            ->immutable(),
        SlugDefinition::for('code')
            ->from(fn (Product $product, ?string $locale): string => $product->sku)
            ->lowercase(false)
            ->notUnique(),
    );
}

Definície sa spracúvajú v poradí deklarácie, takže neskorší stĺpec môže ako zdroj použiť skorší slug. Najviac jedna definícia môže byť routeKey(); duplicitné stĺpce alebo viac route kľúčov vyhodia InvalidSlugDefinitionException.

Zdroje

from() prijíma názov atribútu, zoznam atribútov, bodkové cesty cez relácie (načítané cez loadMissing(), takže preventLazyLoading() neprotestuje) alebo closure fn (Model $m, ?string $locale): ?string. Skalárne atribúty sa čítajú cez getAttribute(), takže sa uplatnia accessory aj casty a enumy použijú svoju hodnotu. Chýbajúca relácia neprispeje ničím.

Všetky voľby

MetódaVýznam
for(string $column)Stĺpec slugu.
from(string|list<string>|Closure)Atribút(y), bodkové cesty cez relácie (načítané cez loadMissing) alebo fn (Model $m, ?string $locale): ?string.
sourceLocale(string)Ktorý jazyk zdroja s jazykovou mapou napĺňa reťazcový slug (predvolene: záložný → aktuálny → prvý).
separator(string), maxLength(int), maxWords(?int)Formátovanie.
language(string|Closure|null), dictionary(array), unicode(), lowercase(bool)Transliterácia a znaky.
using(Closure $slugger)Nahradí kroky formátovania; výstup sa aj tak overí ako bezpečný segment URL.
reserved(list<string>)Ďalšie rezervované slová.
prefix(string|Closure), suffix(string|Closure)Predpona a prípona, ktoré skracovanie nikdy neoreže.
unique(), uniqueWithin(string ...$columns), uniqueWhere(Closure), notUnique()Jedinečnosť.
perLocaleUniqueness(), uniqueAcrossLocales()Len pre jazykové mapy.
includeTrashed(bool), excludeTrashed()Či sa soft-deleted riadky počítajú ako obsadené.
sequentialSuffix(int $start = 2), randomSuffix(?int $length), suffixUsing(SuffixGenerator|Closure)Stratégia pri kolízii.
randomLength(int)Dĺžka náhodného slugu / sufixu (4–32).
onCreate(bool), onUpdate(UpdatePolicy), immutable(), regenerateOnUpdate()Životný cyklus.
manual(ManualSlugPolicy)Ako sa zaobchádza s ručne zadanými hodnotami.
whenEmptySource(EmptySourcePolicy)Prázdny zdroj → random / skip / fail.
lockWhen(Closure), locked()Zmrazí slug (napr. po publikovaní).
skipWhen(Closure)Pri danom uložení stĺpec preskočí.
localized(bool), storage(SlugStorage)Vynúti typ úložiska (predvolene sa zistí automaticky).
locales(TargetLocales|list<string>|Closure)Pre ktoré jazyky sa slugy generujú.
fallback(LocaleFallback), fallbackLocale(string|Closure|null)Reťazec pre čítanie/binding a jeho záložný jazyk.
routeKey(bool)Stĺpec sa stane getRouteKeyName() (najviac jeden).
bindByKeyFallback(bool)Po neúspechu podľa slugu skúsi primárny kľúč.
keepHistory(bool), redirectFromHistory(bool), avoidHistoricalSlugs(bool)História slugov.
retries(int)Opakovania pri súbehu (0 vypne).

Settery s closure sú generické, takže typované closures ako ->lockWhen(fn (Post $post): bool => $post->is_published) prejdú vo vašom kóde cez Larastan na úrovni 7.

Zápis atribútmi

Pre podmnožinu bez closures deklarujte stĺpce ako opakovateľné atribúty triedy #[Slug]:

use RoundlyConsulting\Sluggable\Attributes\Slug;

#[Slug('slug', from: 'name', uniqueWithin: ['kind_id'], routeKey: true)]
#[Slug('short', from: ['kind.name', 'name'], maxLength: 40, onUpdate: UpdatePolicy::Never)]
final class Breed extends Model implements Sluggable
{
    use HasSlug;
}

Atribút prijíma column, from, separator, maxLength, maxWords, language, unicode, lowercase, uniqueness, uniqueWithin, includeTrashed, localeUniqueness, onUpdate, manual, emptySource, suffix, suffixStart, randomLength, storage, locales, fallback, routeKey, bindByKeyFallback, keepHistory, redirectFromHistory a reserved. SuffixStrategy::Custom sa atribútom vyjadriť nedá.

Poradie prednosti

  • Prepísaná metóda slugOptions() na modeli — má vždy prednosť.
  • Atribúty triedy #[Slug] — zdedia sa z rodičovskej triedy, ak potomok žiadne nedeklaruje.
  • SlugOptions::defaults() — jedna definícia: defaults.column generovaný z defaults.source.

Súčasná deklarácia atribútov a prepísanie slugOptions() vyhodí v prostrediach local a testing výnimku conflictingSources.

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.