Rutes

Com definir rutes a Laravel: rutes web, API, resource, grups i paràmetres.

Rutes bàsiques#

Les rutes són el punt d'entrada de la teva aplicació. Cada URL que un usuari visita ha de tenir una ruta definida que digui a Laravel què fer. Les rutes web es defineixen al fitxer routes/web.php:

use Illuminate\Support\Facades\Route;
 
Route::get('/hola', function () {
    return 'Hola, món!';
});

Aquesta ruta escolta peticions GET a /hola i retorna un text senzill. Per retornar una vista Blade, pots fer servir el helper view():

Route::get('/', function () {
    return view('welcome');
});

Laravel suporta tots els mètodes HTTP. Cada mètode correspon a una acció diferent sobre un recurs:

Route::get('/usuaris', [UserController::class, 'index']);
Route::post('/usuaris', [UserController::class, 'store']);
Route::put('/usuaris/{id}', [UserController::class, 'update']);
Route::patch('/usuaris/{id}', [UserController::class, 'update']);
Route::delete('/usuaris/{id}', [UserController::class, 'destroy']);

Si necessites que una ruta respongui a múltiples mètodes HTTP, pots fer servir match() o any():

Route::match(['get', 'post'], '/formulari', [FormController::class, 'handle']);
Route::any('/webhook', [WebhookController::class, 'handle']);

Paràmetres de ruta#

Sovint necessitaràs capturar segments de la URL com a paràmetres. Laravel ho fa senzill amb les claus {}:

Route::get('/usuari/{id}', function (string $id) {
    return "Usuari: {$id}";
});

Els paràmetres també poden ser opcionals afegint un ? després del nom. En aquest cas, cal proporcionar un valor per defecte a l'argument de la funció:

Route::get('/usuari/{nom?}', function (?string $nom = 'Anònim') {
    return "Hola, {$nom}";
});

Per restringir el format d'un paràmetre, pots encadenar el mètode where() amb una expressió regular:

Route::get('/usuari/{id}', function (string $id) {
    // Només s'executarà si $id conté xifres
})->where('id', '[0-9]+');
 
// Helpers per restriccions comunes
Route::get('/article/{slug}', function (string $slug) {
    // ...
})->whereAlpha('slug');
 
Route::get('/ordre/{id}', function (string $id) {
    // ...
})->whereNumber('id');

Rutes amb nom#

Assignar un nom a una ruta permet generar URLs sense dependre de la URL real. Si en algun moment canvies la URL, els enllaços es mantindran correctes:

Route::get('/perfil', [ProfileController::class, 'show'])
    ->name('profile.show');
 
// Generar URL des de qualsevol lloc
$url = route('profile.show');
 
// Amb paràmetres
$url = route('users.show', ['id' => 1]);

A les vistes Blade, pots fer servir el helper route() directament:

<a href="{{ route('profile.show') }}">El meu perfil</a>

Grups de rutes#

Quan vàries rutes comparteixen middleware, prefix o namespaces, pots agrupar-les per evitar repeticions. Un grup de rutes aplica les mateixes opcions a totes les rutes que conté:

Route::prefix('admin')
    ->middleware('auth')
    ->group(function () {
        Route::get('/dashboard', [AdminController::class, 'dashboard']);
        Route::get('/usuaris', [AdminController::class, 'users']);
        Route::get('/configuracio', [AdminController::class, 'settings']);
    });

Totes les rutes d'aquest grup tindran el prefix /admin i requeriran autenticació. És a dir, /admin/dashboard, /admin/usuaris i /admin/configuracio.

Rutes Resource#

Les rutes resource creen automàticament totes les rutes CRUD per a un recurs amb una sola línia:

Route::resource('articles', ArticleController::class);

Aquesta línia genera set rutes:

// GET    /articles           → index    (llistar)
// GET    /articles/create    → create   (formulari de creació)
// POST   /articles           → store    (desar)
// GET    /articles/{id}      → show     (mostrar)
// GET    /articles/{id}/edit → edit     (formulari d'edició)
// PUT    /articles/{id}      → update   (actualitzar)
// DELETE /articles/{id}      → destroy  (eliminar)

Si no necessites totes les accions, pots limitar-les amb only() o except():

Route::resource('articles', ArticleController::class)
    ->only(['index', 'show']);
 
Route::resource('articles', ArticleController::class)
    ->except(['destroy']);

Llistar rutes#

Per veure totes les rutes registrades a la teva aplicació, pots fer servir la comanda Artisan:

php artisan route:list

Aquesta comanda mostra una taula amb el mètode HTTP, la URL, el nom, el controlador i els middleware de cada ruta. És molt útil per verificar que les rutes estan configurades correctament.