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

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 migrate

Ako 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 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.