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óda | Vý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 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.