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, andnamespacefor 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');
});