Управління параметрами URL у додатках Laravel, особливо в тих, що підтримують кілька мов або мають складні маршрути, може стати рутинним. Laravel пропонує елегантне рішення через установку значень за замовчуванням для URL, що дозволяє визначити глобальні параметри для вашої програми. Давайте розглянемо реалізацію цієї потужної функції.
Значення за замовчуванням для URL дозволяють визначити глобальні параметри для URL в усьому додатку. Це особливо корисно для обробки загальних параметрів, таких як мовні налаштування або регіональні параметри.
Розглянемо імплементацію значень за замовчуванням у багатомовному додатку з підтримкою валют:
<?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);
}
}
Зареєструйте проміжний програмний продукт у вашому Kernel:
<?php
namespace App\Http;
class Kernel extends HttpKernel
{
protected $middleware = [
// ... інші проміжні програмні продукти
\App\Http\Middleware\SetUrlDefaults::class,
];
}
Імплементація структури маршрутів:
<?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()
{
// URL автоматично використовуватимуть значення за замовчуванням для локалі та валюти
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();
}
}
У ваших видах ви можете генерувати URL без явного зазначення параметрів за замовчуванням:
<!-- Перегляд списку продуктів -->
<nav>
<a href="{{ route('products.index') }}">{{ __('Всі продукти') }}</a>
<a href="{{ route('products.show', $product) }}">{{ $product->name }}</a>
</nav>
<!-- Переопреділяйте лише за необхідності -->
<a href="{{ route('products.index', ['currency' => 'EUR']) }}">
{{ __('Переглянути в євро') }}
</a>
Ця реалізація забезпечує чисту та підтримувану маршрутизацію, автоматично оброблюючи переваги користувачів у вашому додатку.