Склеювання URL рядками - джерело тонких помилок: забутий ? чи &, подвійне кодування, втрачені параметри, // у шляху, неекранований пробіл.
// крихко
$url = $base . '/search?q=' . $query . '&page=' . $page;
Illuminate\Support\Uri (на основі бібліотеки League URI) дає незмінний (immutable) об'єкт для розбору й зміни адрес:
use Illuminate\Support\Uri;
$uri = Uri::of('https://example.com/search?q=php')
->withQuery(['page' => 2]) // злиття з наявними параметрами
->withFragment('results');
(string) $uri; // 'https://example.com/search?q=php&page=2#results'
$uri->host(); // 'example.com'
$uri->path(); // 'search'
$uri->query()->get('q'); // 'php'
$uri->pathSegments(); // колекція сегментів
Змінення параметрів запиту:
| Метод | Що робить |
|---|---|
withQuery([...]) |
додає й перезаписує параметри (merge: false - замінює всі) |
withQueryIfMissing([...]) |
лише відсутні - зручно для значень за замовчуванням |
withoutQuery(['utm_source']) |
прибрати параметри |
replaceQuery([...]) |
замінити весь рядок запиту |
pushOntoQuery('tags', 'php') |
додати значення до масиву tags[] |
Кожен with... повертає новий об'єкт - вихідний не змінюється, тож базову адресу можна безпечно перевикористовувати.
Інтеграція з маршрутизацією:
Uri::route('posts.show', ['post' => $post]);
Uri::signedRoute('unsubscribe', ['user' => $user]);
Uri::temporarySignedRoute('download', now()->addHour(), ['file' => $file]);
return Uri::to('/dashboard')->withQuery(['tab' => 'billing'])->redirect();
Поточний запит: $request->uri() повертає той самий об'єкт, тож «поточна сторінка з іншим фільтром» будується без ручного розбору $_GET:
$request->uri()->withQuery(['sort' => 'price'])->withoutQuery(['page']);
Де це особливо важливо:
- очищення URL від трекінгових параметрів перед збереженням чи порівнянням;
- побудова посилань на сторонні API з набором параметрів;
- перевірка редиректів:
Uri::of($next)->host()замість регулярних виразів - щоб не відкрити відкритий редирект на чужий домен.
Обмеження: Uri не валідує, що адреса безпечна чи досяжна. Для SSRF-захисту потрібна окрема перевірка схеми, хоста й IP-адреси, до якої він резолвиться.