All web routes are defined in routes/web.php. The framework injects the global $router instance automatically.
Basic Routes
routes/web.php
PHP
// routes/web.php
use App\Controllers\HomeController;
use App\Controllers\PostController;
use App\Controllers\AuthController;
// Closure route returning a view
$router->get('/', fn() => view('welcome'));
// Controller action route
$router->get('/posts', [PostController::class, 'index']);
$router->post('/posts', [PostController::class, 'store']);
$router->get('/posts/{id}', [PostController::class, 'show']);
$router->put('/posts/{id}', [PostController::class, 'update']);
$router->delete('/posts/{id}', [PostController::class, 'destroy']);Route Parameters
Route parameters are wrapped in curly braces and injected directly into controller methods by name:
routes/web.php
PHP
// Route
$router->get('/users/{id}/posts/{slug}', [PostController::class, 'userPost']);
// Controller
class PostController
{
public function userPost(string $id, string $slug): Response
{
$post = Post::where('user_id', '=', $id)
->where('slug', '=', $slug)
->first();
return view('posts.show', ['post' => $post]);
}
}Route Groups & Middleware
Group routes that share common path prefixes or middleware:
routes/web.php
PHP
// Protected routes
$router->group(['middleware' => ['auth']], function ($r) {
$r->get('/dashboard', [DashboardController::class, 'index']);
$r->get('/profile', [ProfileController::class, 'edit']);
$r->put('/profile', [ProfileController::class, 'update']);
});
// Admin group with prefix and dual middleware
$router->group(['prefix' => '/admin', 'middleware' => ['auth', 'admin']], function ($r) {
$r->get('/users', [AdminController::class, 'users']);
$r->delete('/users/{id}', [AdminController::class, 'deleteUser']);
});