vlados / laravel-unique-urls
A package for using and generating unique urls for each Eloquent model in Laravel
Fund package maintenance!
vlados
Installs: 1 573
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 1
pkg:composer/vlados/laravel-unique-urls
Requires
- php: ^8.2
- illuminate/contracts: ^11.0|^12.0
- spatie/laravel-model-info: ^2.0
- spatie/laravel-package-tools: ^1.9.2
- spatie/laravel-translatable: ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- larastan/larastan: ^3.0
- nunomaduro/collision: ^8.0
- nunomaduro/phpinsights: ^2.4
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-faker: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpunit/phpunit: ^11.0
- spatie/laravel-ray: ^1.26
- dev-main
- v2.1.0
- v2.0.1
- v2.0.0
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- v0.4.1
- v0.4.0
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.0
- v0.1.0
- dev-depfu/check/composer/spatie/laravel-package-tools-1.93.0
- dev-depfu/check/composer/illuminate/contracts-12.52.0
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-4.1.0
- dev-depfu/update/composer/pestphp/pest-4.4.1
- dev-depfu/update/composer/phpunit/phpunit-12.5.12
- dev-depfu/update/composer/phpunit/phpunit-13.0.2
- dev-depfu/check/composer/illuminate/contracts-12.50.0
- dev-depfu/update/composer/phpunit/phpunit-13.0.0
- dev-depfu/update/composer/phpunit/phpunit-12.5.8
- dev-depfu/update/composer/phpunit/phpunit-12.5.6
- dev-depfu/update/composer/pestphp/pest-4.3.1
- dev-depfu/update/composer/pestphp/pest-4.3.0
- dev-depfu/update/composer/pestphp/pest-4.2.0
- dev-depfu/update/composer/phpunit/phpunit-12.5.4
- dev-depfu/update/composer/phpunit/phpunit-12.5.3
- dev-depfu/update/composer/phpunit/phpunit-12.5.2
- dev-depfu/update/composer/phpunit/phpunit-12.5.1
- dev-depfu/update/composer/phpunit/phpunit-12.5.0
- dev-depfu/update/composer/orchestra/testbench-10.8.0
- dev-depfu/update/composer/pestphp/pest-4.1.6
- dev-depfu/update/composer/pestphp/pest-4.1.5
- dev-depfu/update/composer/orchestra/testbench-10.7.0
- dev-depfu/update/composer/phpunit/phpunit-12.4.4
- dev-depfu/update/composer/pestphp/pest-4.1.4
- dev-depfu/update/composer/phpunit/phpunit-12.4.3
- dev-depfu/update/composer/phpunit/phpunit-12.4.2
- dev-depfu/update/composer/pestphp/pest-4.1.3
- dev-depfu/update/composer/phpunit/phpunit-12.4.1
- dev-depfu/update/composer/pestphp/pest-4.1.2
- dev-depfu/update/composer/phpunit/phpunit-12.4.0
- dev-depfu/update/composer/pestphp/pest-4.1.1
- dev-depfu/update/composer/phpunit/phpunit-12.3.15
- dev-depfu/update/composer/pestphp/pest-plugin-faker-4.0.0
- dev-claude/issue-67-20251001-2050
- dev-claude/issue-13-20251001-2045
- dev-claude/issue-5-20251001-2037
- dev-add-claude-github-actions-1759346617443
- dev-depfu/update/composer/phpunit/phpunit-12.3.12
- dev-depfu/update/composer/phpunit/phpunit-11.5.38
- dev-depfu/update/composer/pestphp/pest-4.1.0
- dev-depfu/update/composer/phpunit/phpunit-12.3.8
- dev-depfu/update/composer/pestphp/pest-4.0.4
- dev-depfu/update/composer/phpunit/phpunit-11.5.35
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-4.0.0
- dev-depfu/update/composer/phpunit/phpunit-12.3.6
- dev-depfu/update/composer/pestphp/pest-4.0.3
- dev-depfu/update/composer/pestphp/pest-4.0.2
- dev-depfu/update/composer/pestphp/pest-3.8.4
- dev-depfu/update/composer/pestphp/pest-4.0.0
- dev-depfu/update/composer/orchestra/testbench-10.6.0
- dev-depfu/update/composer/pestphp/pest-3.8.3
- dev-depfu/update/composer/phpunit/phpunit-10.5.52
- dev-depfu/update/composer/phpunit/phpunit-10.5.51
- dev-depfu/update/composer/phpunit/phpunit-12.3.3
- dev-depfu/update/composer/phpunit/phpunit-10.5.49
- dev-depfu/update/composer/phpunit/phpunit-12.3.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.28
- dev-depfu/update/composer/phpunit/phpunit-12.2.8
- dev-depfu/update/composer/phpunit/phpunit-10.5.48
- dev-depfu/update/composer/phpunit/phpunit-11.5.26
- dev-depfu/update/composer/phpunit/phpunit-11.5.25
- dev-depfu/update/composer/nunomaduro/collision-8.8.2
- dev-depfu/update/composer/phpunit/phpunit-12.2.3
- dev-depfu/update/composer/orchestra/testbench-10.4.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.23
- dev-depfu/update/composer/nunomaduro/collision-8.8.1
- dev-depfu/update/composer/phpunit/phpunit-12.2.1
- dev-depfu/update/composer/phpunit/phpunit-11.5.22
- dev-depfu/update/composer/phpunit/phpunit-11.5.21
- dev-depfu/update/composer/phpunit/phpunit-11.5.20
- dev-depfu/update/composer/orchestra/testbench-9.13.1
- dev-depfu/update/composer/orchestra/testbench-8.35.1
- dev-depfu/update/composer/phpunit/phpunit-11.5.18
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.2.0
- dev-depfu/update/composer/orchestra/testbench-10.2.1
- dev-depfu/update/composer/pestphp/pest-3.8.2
- dev-depfu/update/composer/phpunit/phpunit-12.1.2
- dev-depfu/update/composer/phpunit/phpunit-12.1.0
- dev-depfu/update/composer/pestphp/pest-3.8.1
- dev-depfu/update/composer/nunomaduro/collision-8.8.0
- dev-depfu/update/composer/pestphp/pest-3.8.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.15
- dev-depfu/update/composer/phpunit/phpunit-11.5.14
- dev-depfu/update/composer/nunomaduro/collision-7.12.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.12
- dev-depfu/update/composer/orchestra/testbench-8.34.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.11
- dev-depfu/update/composer/orchestra/testbench-10.0.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.10
- dev-depfu/update/composer/phpunit/phpunit-11.5.9
- dev-depfu/update/composer/orchestra/testbench-9.11.0
- dev-depfu/update/composer/phpunit/phpunit-11.5.8
- dev-depfu/update/composer/orchestra/testbench-9.10.0
- dev-depfu/update/composer/phpunit/phpunit-12.0.2
- dev-depfu/update/composer/phpunit/phpunit-12.0.1
- dev-depfu/update/composer/phpunit/phpunit-10.5.45
- dev-depfu/update/composer/phpunit/phpunit-10.5.44
- dev-depfu/update/composer/phpunit/phpunit-10.5.43
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.1.0
- dev-depfu/update/composer/pestphp/pest-3.7.3
- dev-depfu/update/composer/nunomaduro/collision-8.6.0
- dev-depfu/update/composer/pestphp/pest-3.7.2
- dev-depfu/update/composer/phpunit/phpunit-11.5.3
- dev-depfu/update/composer/phpunit/phpunit-10.5.40
- dev-depfu/update/composer/orchestra/testbench-9.8.0
- dev-depfu/update/composer/pestphp/pest-3.7.1
- dev-depfu/update/composer/phpunit/phpunit-11.5.0
- dev-depfu/update/composer/pestphp/pest-3.6.0
- dev-depfu/update/composer/phpunit/phpunit-11.4.4
- dev-depfu/update/composer/orchestra/testbench-9.6.1
- dev-depfu/update/composer/orchestra/testbench-8.28.0
- dev-depfu/update/composer/pestphp/pest-3.5.1
- dev-depfu/update/composer/phpunit/phpunit-10.5.38
- dev-depfu/update/composer/pestphp/pest-3.5.0
- dev-depfu/update/composer/phpunit/phpunit-10.5.37
- dev-depfu/update/composer/nunomaduro/collision-8.5.0
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.0.0
- dev-depfu/update/composer/orchestra/testbench-8.26.0
- dev-depfu/update/composer/pestphp/pest-2.35.1
- dev-depfu/update/composer/orchestra/testbench-8.25.0
- dev-depfu/update/composer/phpunit/phpunit-10.5.30
- dev-depfu/update/composer/phpunit/phpunit-11.3.1
- dev-depfu/update/composer/nunomaduro/collision-8.4.0
- dev-depfu/update/composer/pestphp/pest-2.35.0
- dev-depfu/update/composer/phpunit/phpunit-11.3.0
- dev-depfu/update/composer/phpunit/phpunit-11.2.9
- dev-depfu/update/composer/phpunit/phpunit-10.5.29
- dev-depfu/update/composer/phpunit/phpunit-10.5.28
- dev-depfu/update/composer/nunomaduro/collision-8.3.0
- dev-depfu/update/composer/phpunit/phpunit-10.5.26
- dev-depfu/update/composer/phpunit/phpunit-10.5.25
- dev-depfu/update/composer/phpunit/phpunit-10.5.24
- dev-depfu/update/composer/phpunit/phpunit-10.5.22
- dev-depfu/update/composer/phpunit/phpunit-10.5.21
- dev-depfu/update/composer/pestphp/pest-2.34.8
- dev-depfu/update/composer/phpunit/phpunit-11.2.0
- dev-depfu/update/composer/orchestra/testbench-9.1.2
- dev-depfu/update/composer/orchestra/testbench-9.1.1
- dev-depfu/update/composer/orchestra/testbench-8.23.0
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-2.4.0
- dev-depfu/update/composer/phpunit/phpunit-10.5.19
- dev-depfu/update/composer/orchestra/testbench-9.0.4
- dev-depfu/update/composer/phpunit/phpunit-10.5.18
- dev-depfu/update/composer/phpunit/phpunit-11.1.1
- dev-depfu/update/composer/pestphp/pest-2.34.7
- dev-depfu/update/composer/phpunit/phpunit-10.5.16
- dev-depfu/update/composer/orchestra/testbench-9.0.3
- dev-depfu/update/composer/pestphp/pest-2.34.5
- dev-depfu/update/composer/phpunit/phpunit-10.5.15
- dev-depfu/update/composer/orchestra/testbench-8.22.1
- dev-depfu/update/composer/orchestra/testbench-8.22.0
- dev-depfu/update/composer/pestphp/pest-2.34.2
- dev-depfu/update/composer/phpunit/phpunit-10.5.12
- dev-depfu/update/composer/nunomaduro/collision-8.1.1
- dev-depfu/update/composer/phpunit/phpunit-11.0.4
- dev-feature/add-rebuild-command
- dev-feature/48-implement-fallback-locale
This package is auto-updated.
Last update: 2026-02-22 16:30:18 UTC
README
Generate unique, prefix-free URLs for any Eloquent model — blogs, e-commerce, multi-language platforms.
PHP 8.2+ | Laravel 11, 12
Features
- Auto-trim slashes to prevent 404 errors
- Multi-language URLs (distinct slugs per locale, not just prefixes)
- Automatic redirects when URLs change (301 by default)
- Hierarchical URLs via parent relationships (e.g.
category/product) - Livewire full-page component support (FQCN and SFC names)
- Batch generation with progress tracking for large datasets
- Slug validation and reserved-slug protection
urls:doctorcommand for configuration health checks
Installation
composer require vlados/laravel-unique-urls
php artisan vendor:publish --tag="laravel-unique-urls-migrations"
php artisan migrate
Quick Start
Add the trait to your model and define how URLs are built:
use Vlados\LaravelUniqueUrls\HasUniqueUrls; class Product extends Model { use HasUniqueUrls; public function urlStrategy($language, $locale): string { return Str::slug($this->name, '-', $locale); } public function urlHandler(): array { return [ 'controller' => ProductController::class, 'method' => 'view', 'arguments' => [], ]; } }
Register the catch-all route at the end of routes/web.php:
Route::get('{urlObj}', [\Vlados\LaravelUniqueUrls\LaravelUniqueUrlsController::class, 'handleRequest']) ->where('urlObj', '.*');
Access URLs on any model instance:
$product->relative_url; // "my-product" $product->absolute_url; // "https://example.com/my-product" $product->getSlug('en'); // slug for a specific language
Documentation
- Configuration — config options and defaults
- Usage — model setup, routes, multi-language, Livewire
- Bulk Operations — batch generation, global toggles, performance
- Artisan Commands —
urls:generateandurls:doctor - Testing — assertion helpers and example tests
- Troubleshooting — common issues and fixes
Changelog
See CHANGELOG.md for release history.
Contributing
This project follows Conventional Commits.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). See LICENSE.md for details.