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

Slugy sa generujú v bežných eventoch modelu, takže feature testy nepotrebujú žiadnu špeciálnu prípravu — vytvorte modely a overujte cez verejné API:

use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Sluggable\Enums\ChangeReason;
use RoundlyConsulting\Sluggable\Events\SlugChanged;

it('generates unique slugs from the name', function () {
    expect(Clinic::create(['name' => 'Happy Paws'])->slug)->toBe('happy-paws');
    expect(Clinic::create(['name' => 'Happy Paws'])->slug)->toBe('happy-paws-2');
});

it('announces a manual slug change', function () {
    Event::fake([SlugChanged::class]);

    $clinic = Clinic::create(['name' => 'Happy Paws']);
    $clinic->update(['slug' => 'happy-paws-vienna']);

    Event::assertDispatched(SlugChanged::class, fn (SlugChanged $event): bool =>
        $event->current === 'happy-paws-vienna' && $event->reason === ChangeReason::Manual);
});

it('redirects a retired slug to the current one', function () {
    // Product: ->regenerateOnUpdate()->keepHistory()->routeKey(); Route::get('/products/{product}', …)
    $product = Product::create(['name' => 'Classic Chair']);
    $product->update(['name' => 'Heritage Chair']);

    $this->get('/products/classic-chair')->assertStatus(301)->assertRedirect('/products/heritage-chair');
});
  • Veľké factories, pri ktorých na slugu nezáleží, spúšťajte vnútri Slugs::withoutGeneration() — vynechá generovanie, eventy aj históriu.
  • Testy histórie potrebujú publikované sluggable-migrations v adresári migrácií, aby RefreshDatabase vytvoril tabuľku slug_history.
  • Slugs::generate($model) vám vráti hodnotu, ktorú by model dostal, bez toho, aby sa čokoľvek uložilo.

Regenerovanie vo fronte

Slugs::fake() neexistuje: generovanie je deterministické a beží nad vašou vlastnou databázou, preto overujte uložené riadky. Pri queueRegeneration() použite Bus::fake() z Laravelu a overte odoslanie RegenerateSlugsJob:

use Illuminate\Support\Facades\Bus;
use RoundlyConsulting\Sluggable\Enums\RegenerationMode;
use RoundlyConsulting\Sluggable\Facades\Slugs;
use RoundlyConsulting\Sluggable\Jobs\RegenerateSlugsJob;

it('queues a full regeneration', function () {
    Product::create(['name' => 'Classic Chair']);
    Bus::fake();

    Slugs::model(Product::class)->queueRegeneration(mode: RegenerationMode::All);

    Bus::assertDispatched(RegenerateSlugsJob::class);
});

Vlastná testovacia sada balíka

composer test            # Pest
composer test-coverage   # Pest with a 90 % coverage floor
composer analyse         # Larastan level 7

Pest sada beží na SQLite, PostgreSQL aj MySQL vrátane reálnych súbežných zápisov a testov presmerovaní na úrovni HTTP.

Statická analýza

Balík obsahuje rozšírenie pre PHPStan (extension.neon, automaticky zahrnuté cez phpstan/extension-installer), vďaka ktorému Larastan pozná $table->slug(), $table->localizedSlug(), $table->uniqueSlug(), Rule::uniqueSlug() a Rule::validSlug().

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.