História slugov a presmerovania
Zapnite históriu pre definíciu (alebo globálne cez history.enabled), potom publikujte a spustite migráciu histórie:
SlugDefinition::for('slug')->from('name')->regenerateOnUpdate()->keepHistory()->routeKey();php artisan vendor:publish --tag="sluggable-migrations"
php artisan migrateAko fungujú presmerovania
- Každá uložená zmena presunie predchádzajúcu hodnotu do slug_history. Ak si model vezme späť niektorý zo svojich starých slugov, daný záznam sa odstráni.
- Požiadavka GET alebo HEAD s vyradeným slugom vráti 301 (history.redirect_status) na tú istú routu s aktuálnym slugom a zachová query string. Ostatné metódy dostanú 404.
- Cieľ sa vyhľadá cez vlastný dopyt routy — globálne scopes, rodič vnoreného bindingu, zaobchádzanie so zmazanými záznamami — takže koncepty, záznamy iných tenantov ani zmazané riadky sa nikdy neodhalia.
- Zo vstupu pochádza len zhodný segment routy, takže otvorené presmerovanie nie je možné. SlugMovedException implementuje ShouldntReport; do vášho chybového logu sa nikdy nedostane.
- redirectFromHistory(false) históriu uchová bez presmerovania; avoidHistoricalSlugs() zabráni iným modelom prevziať vyradený slug.
Vyhľadávanie
Slugs::model() nájde vyradený slug cez predvolený dopyt modelu (s globálnymi scopes) alebo cez dopyt, ktorý odovzdáte ako within:
use RoundlyConsulting\Sluggable\Facades\Slugs;
Slugs::model(Product::class)->findInHistory('old-name', column: 'slug', locale: 'sk'); // ?Model
// Resolve only within a query you trust — a retired slug never reveals a row it would not return
Slugs::model(Product::class)->findInHistory('old-name', within: Product::query()->where('shop_id', $shop->id));Upratovanie a premazávanie
Záznamy histórie sa odstránia pri skutočnom zmazaní modelu (bez SoftDeletes alebo pri force delete); soft delete ich ponechá. Hromadné mazanie, ktoré nespúšťa eventy modelu, zanechá neškodné osirotené riadky — premazávanie ich časom odstráni. Nastavte history.prune_after_days a naplánujte Laravel príkaz model:prune pre model histórie (alebo váš nakonfigurovaný history.model):
// routes/console.php, with sluggable.history.prune_after_days set
Schedule::command('model:prune', ['--model' => [\RoundlyConsulting\Sluggable\Models\SlugHistory::class]]);Obmedzenia
- Stĺpec morph id histórie sa riadi sluggable.key_type (bigint, uuid alebo ulid); model, ktorého typ kľúča nezodpovedá, sa odmietne už pri definícii (historyKeyTypeMismatch). Jeden typ kľúča na aplikáciu.
- História ukladá slugy do 255 znakov; definícia s históriou a väčším maxLength sa odmietne už pri definícii.
- Model histórie je vymeniteľný cez history.model — vaša trieda musí rozširovať SlugHistory.
- Ak tabuľka histórie chýba, v prostrediach local a testing sa vyhodí historyTableMissing; inde sa zaloguje varovanie a záznam sa preskočí — nikdy nevznikne chyba 500 po uložení riadku.
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.