Generació d'URLs
Com generar URLs a Laravel: helpers, URLs de rutes amb nom i signed URLs.
Helpers d'URL#
Laravel proporciona el helper url() per generar URLs absolutes a partir de camins relatius. Això garanteix que les URLs sempre incloguin el domini correcte configurat a APP_URL, independentment de l'entorn on s'executi l'aplicació:
$url = url('/usuaris');
// http://app.test/usuaris
$current = url()->current();
// http://app.test/usuaris/1
$full = url()->full();
// http://app.test/usuaris/1?page=2El mètode current() retorna la URL sense query strings, mentre que full() la inclou sencera. Pots fer servir previous() per obtenir la URL de la pàgina anterior (basada en l'header Referer):
$previous = url()->previous();Aquests helpers són especialment útils quan necessites construir URLs dinàmiques a les vistes o quan vols comparar la URL actual amb un valor esperat per marcar elements actius en una navegació.
URLs de rutes amb nom#
La manera més robusta de generar URLs és a través de les rutes amb nom. Quan assignes un nom a una ruta, pots generar la seva URL amb el helper route() sense dependre de la URL real. Si en algun moment canvies la URL de la ruta, tots els enllaços generats amb route() s'actualitzaran automàticament:
// Definir la ruta amb nom
Route::get('/usuari/{id}', [UserController::class, 'show'])
->name('users.show');
// Generar la URL
$url = route('users.show', ['id' => 1]);
// http://app.test/usuari/1Quan passes un model Eloquent com a paràmetre, Laravel utilitza automàticament la seva clau primària:
$url = route('users.show', $user);
// Equivalent a route('users.show', ['id' => $user->id])A les vistes Blade, l'ús és directe i molt llegible:
<a href="{{ route('users.show', $user) }}">
{{ $user->name }}
</a>
<form action="{{ route('users.store') }}" method="POST">
@csrf
{{-- camps del formulari --}}
</form>Comprovar la ruta actual#
Pots comprovar si la petició actual coincideix amb una ruta amb nom. Això és útil per marcar elements actius en una navegació:
// Comprovar si la ruta actual és exactament 'users.index'
if ($request->routeIs('users.index')) {
// ...
}
// Comprovar si la ruta comença per 'users.'
if ($request->routeIs('users.*')) {
// Estem en alguna pàgina d'usuaris
}A Blade, pots fer servir la directiva @routeIs o el helper request():
<a href="{{ route('users.index') }}"
class="{{ request()->routeIs('users.*') ? 'active' : '' }}">
Usuaris
</a>Signed URLs#
Les signed URLs inclouen una signatura criptogràfica que verifica que la URL no ha estat manipulada des que es va generar. Són ideals per a accions sensibles on no vols que l'usuari pugui modificar els paràmetres de la URL manualment:
use Illuminate\Support\Facades\URL;
$url = URL::signedRoute('unsubscribe', ['user' => 1]);
// http://app.test/cancel/1?signature=abc123...Amb aquesta URL, si algú intenta canviar user=1 per user=2, la signatura ja no serà vàlida i la petició serà rebutjada.
Signed URLs amb expiració#
Pots afegir una data d'expiració perquè la URL només sigui vàlida durant un temps limitat. Això és molt útil per a enllaços de verificació d'email, descàrregues temporals o invitacions:
$url = URL::temporarySignedRoute(
'unsubscribe',
now()->addMinutes(30),
['user' => 1]
);Aquesta URL serà vàlida durant 30 minuts. Passat aquest temps, retornarà un error 403 automàticament.
Validar signed URLs#
Hi ha dues maneres de validar la signatura d'una URL. La primera és comprovar-la manualment al controlador:
Route::get('/cancel/{user}', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// Processar la cancel·lació...
})->name('unsubscribe');La segona, més elegant, és utilitzar el middleware signed que fa la validació automàticament i retorna un error 403 si la signatura no és vàlida:
Route::get('/cancel/{user}', function (Request $request) {
// La signatura ja ha estat validada pel middleware
// Si arribem aquí, la URL és vàlida
})->name('unsubscribe')->middleware('signed');El middleware signed és la opció recomanada perquè centralitza la validació i manté el controlador net.
URLs d'assets#
Per generar URLs a fitxers estàtics com imatges, CSS o JavaScript del directori public/, utilitza el helper asset():
$url = asset('img/logo.png');
// http://app.test/img/logo.png
$url = asset('css/app.css');
// http://app.test/css/app.cssSi la teva aplicació serveix assets des d'un CDN, pots configurar el prefix amb la variable ASSET_URL al fitxer .env:
ASSET_URL=https://cdn.exemple.comAmb aquesta configuració, asset('img/logo.png') generarà https://cdn.exemple.com/img/logo.png automàticament.
A les vistes Blade, asset() es fa servir habitualment per incloure imatges i altres recursos:
<img src="{{ asset('img/logo.png') }}" alt="Logo">
<link rel="stylesheet" href="{{ asset('css/custom.css') }}">Si la teva aplicació utilitza Vite per compilar assets, utilitza la directiva @vite en lloc de asset() per als fitxers JavaScript i CSS:
@vite(['resources/css/app.css', 'resources/js/app.js'])Vite s'encarrega de versionar els fitxers automàticament (afegint un hash al nom del fitxer), cosa que evita problemes de cache quan actualitzes el codi.