Slugy a routovanie
Slugy generuje sluggable-for-laravel. Reklamy majú mapu slugov podľa jazykov, vytvorenú z názvu v každom jazyku:
- Pri vytvorení dostane slug každý jazyk, ktorý má vyplnený name, a každý sa prepíše podľa pravidiel svojho jazyka (Red Chair / Červená stolička → red-chair / cervena-stolicka).
- Pri úprave sa pregenerujú len jazyky, ktorých názov sa zmenil; premenovanie so zachovaným základom nikdy nezmení chair-2 na chair-3.
- Kolízie sa riešia v rámci jazyka číselným sufixom od -2 (vintage-road-bike, vintage-road-bike-2, …); soft-deleted reklamy si slug ponechávajú rezervovaný. Rôzne jazyky môžu mať rovnaký slug. Prázdny name nevygeneruje nič.
- Unikátny index pre každý jazyk to vynucuje aj v databáze; súbežný zápis, ktorý prehrá, dostane nový sufix a zopakuje sa.
Route binding
Reklamy sa viažu podľa slugu: najprv v aktívnom jazyku, potom vo fallback_locale a nakoniec v ktoromkoľvek inom podporovanom jazyku — odkaz zdieľaný v inom jazyku teda stále funguje. URL sa generujú zo slugu v aktuálnom jazyku:
use Illuminate\Support\Facades\Route;
use RoundlyConsulting\Advertisements\Models\Advertisement;
// routes/web.php
Route::get('/ads/{advertisement}', fn (Advertisement $advertisement) => $advertisement)->name('ads.show');
// GET /ads/vintage-road-bike resolves the ad whose slug matches, preferring the current locale.
route('ads.show', $ad); // current-locale slug
Advertisement::query()->whereSlug('vintage-road-bike')->first();
Advertisement::query()->whereSlug('stary-bicykel', locale: 'sk')->first();
$ad->slugFor('sk'); // exact locale, no fallbackHistória slugov
Pri zapnutom slugs.history (a publikovanej migrácii balíka sluggable) sa každý starý slug zapamätá a požiadavka GET naň odpovie presmerovaním 301 na aktuálnu URL vrátane query stringu. Natrvalo zmazaná alebo prerezaná reklama si záznamy histórie vezme so sebou; soft-deleted reklama si ich (aj rezervovaný slug) ponechá pre obnovenie.
Kľúče umiestnení a kategórií
Umiestnenia a kategórie majú jediný reťazcový slug — kľúč pre kód, napríklad „sidebar“. Ak ho nevyplníte, vygeneruje sa z názvu vo fallback_locale (Side Banner → side-banner, pri obsadení so sufixom -2). Zadaný slug sa zachová bajt po bajte a obsadený vyhodí SlugAlreadyTakenException namiesto tichého pridania sufixu. Po nastavení sa už nikdy nezmení.
Validácia
Vstup z administrácie validujte pravidlami balíka sluggable, ktoré uplatňujú presne tieto pravidlá:
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Advertisements\Models\Placement;
use RoundlyConsulting\Sluggable\Rules\UniqueSlug;
use RoundlyConsulting\Sluggable\Rules\ValidSlug;
'slug' => ['nullable', 'string', ValidSlug::for(Placement::class), UniqueSlug::for(Placement::class)->ignore($placement)],
'slug' => ['nullable', 'array', UniqueSlug::for(Advertisement::class)->ignore($ad)], // errors on slug.{locale}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.