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 AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use IlluminateSupportFacadesURL;
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 AppHttp;
class Kernel extends HttpKernel
{
protected $middleware = [
// ... other middleware
AppHttpMiddlewareSetUrlDefaults::class,
];
}
Implementing the routing structure:
<?php
use AppHttpControllersProductController;
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.
The post Streamlining Route Parameters in Laravel Using URL Defaults appeared first on Laravel News.
Join the Laravel Newsletter to get all the latest
Laravel articles like this directly in your inbox.
Source: Read MoreÂ