Cleaner API Routes with Consistent Grouping

📖 2 minutes read

When your routes file starts getting messy, apply these refactoring patterns to bring order back:

## 1. Group by middleware first, then prefix and name

“`php
// Before: scattered middleware
Route::post(‘logout’, [AuthController::class, ‘logout’])->middleware(‘auth:sanctum’);
Route::get(‘profile/votes’, [VoteController::class, ‘index’])->middleware(‘auth:sanctum’);

// After: group by middleware
Route::middleware(‘auth:sanctum’)->group(function () {
Route::prefix(‘auth’)->name(‘auth.’)->group(function () {
Route::post(‘logout’, [AuthController::class, ‘logout’])->name(‘logout’);
});

Route::prefix(‘profile’)->name(‘profile.’)->group(function () {
// All profile routes here
});
});
“`

## 2. Consolidate multiple apiResource calls

When several resources share the same options, use apiResources():

“`php
// Before: verbose
Route::apiResource(‘regions’, RegionController::class)->except([‘store’, ‘update’, ‘destroy’]);
Route::apiResource(‘provinces’, ProvinceController::class)->except([‘store’, ‘update’, ‘destroy’]);
Route::apiResource(‘mountains’, MountainController::class)->except([‘store’, ‘update’, ‘destroy’]);

// After: consolidated
Route::apiResources([
‘regions’ => RegionController::class,
‘provinces’ => ProvinceController::class,
‘mountains’ => MountainController::class,
], [‘except’ => [‘store’, ‘update’, ‘destroy’]]);
“`

## 3. Use prefix for route parameters

Instead of repeating the same parameter in every URI, move it to the prefix:

“`php
// Before: repeated {trail} in every URI
Route::post(‘trails/{trail}/comments’, [TrailController::class, ‘storeComment’]);
Route::post(‘trails/{trail}/climbs’, [TrailController::class, ‘storeClimb’]);

// After: parameter in prefix
Route::prefix(‘trails/{trail}’)->name(‘trail.’)->middleware(‘auth:sanctum’)->group(function () {
Route::post(‘comments’, [TrailController::class, ‘storeComment’])->name(‘comment’);
Route::post(‘climbs’, [TrailController::class, ‘storeClimb’])->name(‘climb’);
});
“`

**The pattern**: Group by middleware → prefix → name, in that order. Your routes file becomes easier to scan, modify, and maintain.

Daryle De Silva

VP of Technology

11+ years building and scaling web applications. Writing about what I learn in the trenches.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *