Lessons → Laravel → Lesson 2

Routing

Laravel
⏱ 18 min read📖 IntermediateNot completed

Routes define how your application responds to HTTP requests. In Laravel, all web routes are defined in routes/web.php.

Basic Routes

routes/web.php
<?php
use Illuminate\Support\Facades\Route;

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

// Return JSON
Route::get('/api/hello', function () {
    return response()->json(['message' => 'Hello!']);
});

// POST request
Route::post('/contact', function () {
    return 'Form submitted!';
});

// Multiple methods
Route::match(['get', 'post'], '/form', function () {
    return 'GET or POST';
});

// Any method
Route::any('/catch-all', function () {
    return 'Any method works';
});
?>

Route Parameters

PHP
<?php
// Required parameter
Route::get('/users/{id}', function ($id) {
    return "User ID: $id";
});
// URL: /users/42 → "User ID: 42"

// Optional parameter
Route::get('/posts/{slug?}', function ($slug = 'latest') {
    return "Post: $slug";
});
// URL: /posts → "Post: latest"
// URL: /posts/my-article → "Post: my-article"

// Multiple parameters
Route::get('/users/{userId}/posts/{postId}', function ($userId, $postId) {
    return "User $userId, Post $postId";
});

// Type constraint
Route::get('/users/{id}', function ($id) {
    return $id;
})->where('id', '[0-9]+');  // Only numbers
?>

Named Routes

PHP
<?php
// Name a route
Route::get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');

Route::get('/users/{id}', function ($id) {
    return view('user', ['id' => $id]);
})->name('user.show');

// Generate URL from named route
$url = route('dashboard');           // http://app.com/dashboard
$url = route('user.show', ['id' => 5]); // http://app.com/users/5

// Redirect to named route
return redirect()->route('dashboard');
?>

Route Groups

PHP
<?php
// Group with prefix
Route::prefix('admin')->group(function () {
    Route::get('/dashboard', fn() => 'Admin Dashboard');
    Route::get('/users', fn() => 'Manage Users');
    // URLs: /admin/dashboard, /admin/users
});

// Group with middleware
Route::middleware(['auth'])->group(function () {
    Route::get('/profile', fn() => 'Profile');
    Route::get('/settings', fn() => 'Settings');
});

// Group with prefix AND middleware
Route::prefix('admin')
    ->middleware(['auth', 'admin'])
    ->name('admin.')
    ->group(function () {
        Route::get('/dashboard', fn() => 'Dashboard')->name('dashboard');
        // URL: /admin/dashboard, Name: admin.dashboard
    });
?>
💡
Use named routes always! Instead of hardcoding URLs like /users/5, use route('user.show', 5). When URLs change, named routes update automatically everywhere.
← Previous Lesson Next Lesson →
🧠

Test your knowledge!

Take a quiz to reinforce what you learned.

Take Quiz →