Streamlining Route Parameters in Laravel Using URL Defaults


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:

{{ __('All Products') }}
{{ $product->name }}

'EUR']) }}">
{{ __('View in Euros') }}


This implementation provides clean, maintainable routing while automatically handling user preferences across your application.

The post Streamlining Route Parameters in Laravel Using URL Defaults appeared first on Laravel News.
Join the Laravel Newsletter to get Laravel articles like this directly in your inbox.