Table Of Contents
Problem
Your API routes are scattered and you need to organize them with consistent prefixes like /api/v1/
for better structure and versioning.
Solution
Use Route::prefix()
to group routes with a common prefix:
// routes/api.php
Route::prefix('v1')->group(function () {
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{user}', [UserController::class, 'show']);
});
// Generates: /api/v1/users, /api/v1/users/{user}
Combine with middleware and namespaces:
Route::prefix('v1')
->middleware(['auth:sanctum', 'throttle:60,1'])
->name('api.v1.')
->group(function () {
Route::apiResource('users', UserController::class);
Route::apiResource('posts', PostController::class);
});
// Generates named routes: api.v1.users.index, api.v1.users.store, etc.
Multiple API versions:
// Version 1
Route::prefix('v1')->name('api.v1.')->group(function () {
Route::get('/users', [V1\UserController::class, 'index']);
});
// Version 2
Route::prefix('v2')->name('api.v2.')->group(function () {
Route::get('/users', [V2\UserController::class, 'index']);
});
Why It Works
Route prefixes prepend a string to all routes within the group. Laravel automatically combines the base /api
prefix (from RouteServiceProvider
) with your custom prefix. This creates clean, organized URLs while keeping your route definitions maintainable.
Advanced grouping with multiple attributes:
Route::group([
'prefix' => 'admin/v1',
'middleware' => ['auth:sanctum', 'admin'],
'namespace' => 'Admin',
'as' => 'admin.api.'
], function () {
Route::get('/dashboard', 'DashboardController@index');
Route::apiResource('users', 'UserController');
});
Related: Laravel Collections: Beyond Basic Array Operations | Database Design: Fundamentals of Good Database Architecture | Laravel API Development: Best Practices and Security | Implementing API Versioning in Laravel: Multiple Strategies | Laravel Route Model Binding: Beyond the Basics
Add Comment
No comments yet. Be the first to comment!