Streamlining Route Parameters in Laravel Using URL Defaults
Last updated on by Harris Raftopoulos
Managing URL parameters in Laravel applications, particularly those with multiple languages or complex routing patterns, can become repetitive. Laravel provides an elegant solution through URL defaults, allowing you to set application-wide default values for URL parameters. Let's explore this powerful feature's implementation.
Understanding URL Defaults
URL defaults enable you to define global default values for URL parameters across your application. This proves particularly valuable for handling common parameters like language preferences or regional settings.
Let's implement URL defaults in a multilingual application with currency support:
<?php namespace App\Http\Middleware; use Closure;use Illuminate\Http\Request;use Illuminate\Support\Facades\URL; class SetUrlDefaults{ public function handle(Request $request, Closure $next) { URL::defaults([ 'locale' => $request->user()?->preferred_language ?? config('app.locale'), 'currency' => $request->user()?->preferred_currency ?? 'USD' ]); return $next($request); }}
Register the middleware in your kernel:
<?php namespace App\Http; class Kernel extends HttpKernel{ protected $middleware = [ // ... other middleware \App\Http\Middleware\SetUrlDefaults::class, ];}
Implementing the routing structure:
<?php use App\Http\Controllers\ProductController; Route::prefix('{locale}/{currency}')->group(function () { Route::get('products', [ProductController::class, 'index']) ->name('products.index'); Route::get('products/{product}', [ProductController::class, 'show']) ->name('products.show');}); class ProductController extends Controller{ public function index() { // URLs will automatically use default locale and currency return view('products.index', [ 'products' => Product::paginate(20), 'categoryUrl' => route('products.category', ['category' => 'electronics']) ]); } public function changePreferences(Request $request, $locale, $currency) { $request->user()->update([ 'preferred_language' => $locale, 'preferred_currency' => $currency ]); return redirect()->back(); }}
In your views, you can generate URLs without explicitly specifying the defaults:
<!-- Products listing view --><nav> <a href="{{ route('products.index') }}">{{ __('All Products') }}</a> <a href="{{ route('products.show', $product) }}">{{ $product->name }}</a></nav> <!-- Only override when needed --><a href="{{ route('products.index', ['currency' => 'EUR']) }}"> {{ __('View in Euros') }}</a>
This implementation provides clean, maintainable routing while automatically handling user preferences across your application.