Routing

Defining Routes

Define routes in the routes/web.php (for web) and routes/api.php (for APIs) files. Use array syntax with controller class references for clarity and IDE support.

// Good
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);

// Bad
Route::get('/users', 'UserController@index');
  • Use HTTP verbs appropriately: GET for reading, POST for creating, PUT/PATCH for updating, DELETE for deleting.
  • Group related routes together for maintainability.

Route Naming

Name routes for easy reference in code and views. Use dot notation for resourceful routes.

// Good
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::post('/users', [UserController::class, 'store'])->name('users.store');

// Bad
Route::get('/users', [UserController::class, 'index']);
  • Use route names in redirects and URL generation: route('users.index').
  • Name all routes, especially those used in forms and redirects.

Route Grouping

Group routes that share middleware, prefixes, or namespaces for cleaner code.

// Good
Route::middleware('auth')->prefix('admin')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'index']);
});

// Bad
Route::get('/dashboard', [DashboardController::class, 'index'])->middleware('auth');
Route::get('/profile', [ProfileController::class, 'index'])->middleware('auth');
  • Use prefix, middleware, and namespace for grouping.
  • Keep route files organized and readable.

Middleware

Apply middleware to routes or groups for authentication, authorization, and other concerns.

// Good
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/settings', [SettingsController::class, 'index']);
});

// Bad
Route::middleware('auth')->middleware('verified')->group(function () {
    Route::get('/settings', [SettingsController::class, 'index']);
});
  • Use built-in middleware for common tasks (auth, verified, throttle).
  • Create custom middleware for project-specific logic.

Best Practices

  • Use resource controllers for RESTful routes: Route::resource('users', UserController::class);
  • Avoid defining routes in closures for complex logic; use controllers instead.
  • Document routes with comments for clarity.
  • Use route model binding for cleaner controllers.

Example: Route Group

Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
    Route::get('/users', [AdminUserController::class, 'index'])->name('admin.users.index');
    Route::post('/users', [AdminUserController::class, 'store'])->name('admin.users.store');
});