- 🔐 Laravel route groups and middleware greatly reduce wrong access when you plan routing by roles.
- 🏪 Laravel marketplace apps work better with separate route files and guards, making clearer paths for each role.
- 🧰 Custom middleware, like
IsAdmin, makes access control more exact and helps it grow. - 📁 Separating
routes,controllers, andviewsby role makes development and finding and fixing problems easier for larger teams. - 🚀 Route caching (
php artisan route:cache) makes the app much faster when it is live.
The Role-Based Routing Challenge in Laravel
When you build a Laravel marketplace, figuring out how to route different user types, like admins and customers, is one of the hardest parts of the design. Without a good plan, routing can easily become confusing. This can cause wrong people getting in, make the app hard to keep up with, and lead to unclear code in controllers and views. But Laravel has strong tools. These include middleware, guards, and route grouping. They help you build clear, safe route setups that can grow for apps with many roles.
Understanding Laravel Marketplace Application Structures
In a Laravel marketplace, routes control access between users and parts of the system. Most platforms have at least three main user roles:
- Admins: They have full access. They look after system settings, deal with users, handle payments, and check listings.
- Vendors/Sellers: These users list or sell things. They keep track of their products, watch their orders, and talk to customers.
- Customers/Buyers: These are regular users. They look at products, add things to their cart, place orders, and write reviews about products.
Each role uses different parts of the system with dashboards made for them. Admin views show all system data, like all orders and reports. Vendors see their own actions. Customers only manage their personal profiles and purchases.
This means we need routing that keeps each user role in its own area. If not set up right, customers could by accident or on purpose get to admin pages. Or vendors might see each other’s data.
A clear and able to grow Laravel routing setup needs thinking through paths, middleware, views, and controller namespaces. This makes problems less likely and makes it easier to keep up with.
Best Practices: Separating Admin and User Routes
To solve the problem of routing based on roles, Laravel offers a strong way to sort routes well. Using Laravel's service provider design, we can put routes for each role in separate files.
File-Based Route Separation
The RouteServiceProvider class in Laravel lets you set up more route files than the default web.php and api.php.
Update app/Providers/RouteServiceProvider.php to set up specific paths for each user group:
protected function map()
{
$this->mapAdminRoutes();
$this->mapUserRoutes();
$this->mapWebRoutes(); // Optional: For public-facing routes
}
protected function mapAdminRoutes()
{
Route::middleware(['web', 'auth', 'is_admin'])
->prefix('admin')
->namespace($this->namespace . '\Admin')
->group(base_path('routes/admin.php'));
}
protected function mapUserRoutes()
{
Route::middleware(['web', 'auth'])
->namespace($this->namespace . '\User')
->group(base_path('routes/user.php'));
}
Main good points of this setup:
- It's easier to read: You know exactly where admin and user routes are.
- Separate middleware chains: You can apply specific middlewares, like
is_admin, to specific route groups. - Clearer role limits: This makes it less likely that routes will mix up or that someone will get access they shouldn't.
Route Grouping Example
Inside each separate route file, you can still set up route groups and add more rules.
Example from routes/admin.php:
Route::group(['middleware' => ['auth', 'is_admin']], function () {
Route::get('/dashboard', 'DashboardController@index')->name('admin.dashboard');
Route::resource('users', 'UserManagementController');
});
Example from routes/user.php:
Route::group(['middleware' => ['auth']], function () {
Route::get('/dashboard', 'DashboardController@index')->name('user.dashboard');
Route::resource('orders', 'OrderController');
});
By using the same names and sensible groups, your Laravel routing setup becomes a solid base for the entire app.
Implementing Custom Middleware for Role Validation
Laravel gives you a lot of freedom with middleware. This gives you the tools to make sure access rules are followed based on user roles.
Creating a New Middleware
Use Artisan to scaffold:
php artisan make:middleware IsAdmin
Now edit app/Http/Middleware/IsAdmin.php:
public function handle($request, Closure $next)
{
if (auth()->check() && auth()->user()->role === 'admin') {
return $next($request);
}
return redirect('/')->with('error', 'Unauthorized access.');
}
Here, if the user is not an admin, they are sent back to the homepage with an error message.
Register Middleware
Update app/Http/Kernel.php to register your middleware:
protected $routeMiddleware = [
// other middlewares...
'is_admin' => \App\Http\Middleware\IsAdmin::class,
];
You can now use 'is_admin' in route group setups to keep admin routes safe in a standard way.
Authentication Guards & Role-Based Scoping
Guards set how users are logged in, using sessions, tokens, or other methods. They also let you change this for each user group.
Multiple Guards for Separation
Configure guards in config/auth.php:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
And set up providers:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
You can now have separate login code, dashboards, and how sessions work for admins versus users.
Why Use Custom Guards?
- Stops shared session problems between admins and users.
- Lets you have completely different login steps.
- Makes security stronger for important roles like
SuperAdmin.
Directory Structure for Multi-Role Laravel Projects
As routes, controllers, and views get bigger, sorting them by role gives good results for speed and team work over time.
Suggested Structure
/app/Http/Controllers/Admin
/app/Http/Controllers/User
/app/Http/Middleware/IsAdmin.php
/resources/views/admin
/resources/views/user
/routes/admin.php
/routes/user.php
This makes it very easy to know which code belongs to which area. Your team will thank you later.
Separate Your Business Logic
Don't use big, do-everything controllers. Instead of one DashboardController, make Admin\DashboardController and User\DashboardController. This way of doing things stops you from needing checks like:
if(auth()->user()->isAdmin()) { /* show admin view */ }
Let the setup handle it.
Routing in Multi-Role Dashboards vs Front-Facing Pages
Never mix admin, user, and public pages in one area for routes.
Admin Flow
/admin/login
/admin/dashboard
/admin/users
User Flow
/login
/dashboard
/orders
Public Flow
/
/shop
/product/{slug}
/contact
This way, your Laravel marketplace keeps strong lines between what admins see and what users do. Stopping interface parts from mixing also lets frontend developers build parts made for a specific role without confusion.
Middleware & Policy Layer: Layered Authorization Strategy
Using more than one layer for access gives you stronger protection.
- Middleware: Stops people who shouldn't be there from getting to controllers.
- Policies: Set who can do what with certain things in the system.
Using Both
Middleware:
Route::middleware(['auth', 'is_vendor'])->group(function () {
Route::get('/my-products', 'ProductController@index');
});
Policy:
public function update(User $user, Product $product)
{
return $user->id === $product->vendor_id || $user->hasRole('admin');
}
Call in controller:
$this->authorize('update', $product);
This makes sure that even if someone gets to the controller, their action is still checked.
Securing Routes from Unauthorized Access & Testing
A plan for safe routes needs to make sure:
- People who shouldn't be there can't even get to pages they shouldn't see.
- If they try, give them clear messages.
Handling Unauthorized Access
In routes:
Route::middleware(['auth', 'is_admin'])->group(...);
If things go wrong:
return abort(403, 'You do not have access to this resource.');
Or send them away:
return redirect()->route('user.dashboard')->withErrors(['Unauthorized access']);
Testing Unauthorized Access
Automated tests are very important:
public function test_admin_cannot_access_user_route()
{
$admin = User::factory()->create(['role' => 'admin']);
$this->actingAs($admin);
$response = $this->get('/dashboard');
$response->assertRedirect('/admin/dashboard');
}
Use factories to act like real users with set roles. Then, check that things happen as they should.
Example Route Configuration Walkthroughs
Here is some real code:
Admin Login Routes
Route::prefix('admin')->middleware('guest:admin')->group(function () {
Route::get('/login', 'Auth\AdminLoginController@showLoginForm');
Route::post('/login', 'Auth\AdminLoginController@login');
});
Admin Dashboard
Route::prefix('admin')->middleware(['auth:admin', 'is_admin'])->group(function () {
Route::get('/dashboard', 'Admin\DashboardController@index')->name('admin.dashboard');
});
User Dashboard
Route::middleware('auth')->group(function () {
Route::get('/dashboard', 'User\DashboardController@index')->name('user.dashboard');
});
Public Routes
Route::get('/shop', 'MarketplaceController@index');
Route::get('/product/{id}', 'MarketplaceController@show');
Error Messaging, UX and Redirection
Never show plain error pages. Give carefully made messages:
- 403 View: Change
resources/views/errors/403.blade.phpto match your app's look. - Redirect with Message:
return redirect()->route('user.dashboard')->with('error', 'Access Denied: You do not have permission.');
Think about adding breadcrumbs and links to help users fix what they did wrong.
Scaling Beyond Admin and User: Adding More Roles
As your business changes, you will add more roles, like moderator, support, or superadmin. Two main ways to do this:
1. Role Column Enumeration
In users table:
if(auth()->user()->role === 'sales_rep') {
// logic here
}
Pros: Easy to do.
Cons: Gets messy as roles go up. You will check if conditions all the time.
2. Role/Permission Packages
Use Spatie’s package:
composer require spatie/laravel-permission
Then:
$user->assignRole('vendor');
$user->hasRole('moderator');
$user->can('edit products');
Pro: Grows very well. You set up your own abilities and give them out as needed.
Performance & Maintenance Tips
Keeping routes organized makes things faster and easier to manage.
Boost Performance
php artisan route:cache
Use only controllers. Routes that are anonymous functions cannot be cached.
Keep Middleware Lean
Instead of one huge middleware, link together small, reusable ones, like is_admin, is_subscribed, and has_two_factor.
Keep Business Logic DRY
Use these:
- Service classes:
ProductService.php - Traits:
HasRoleTrait.php - Request classes:
UpdateProductRequest.php
Checklist for Role-Based Routing Implementation
Use this checklist before the app goes live:
- Are routes split into
/admin,/user, and/publicsections? - Have you used custom middleware like
is_adminandis_vendor? - Do all protected routes use
authmiddleware or guards? - Are guards in
auth.phpset up completely? - Is your route setup written down for your team?
- Have all access limits been checked with tests?
Final Thoughts: Building for Growth and Team Collaboration
In your Laravel marketplace, routing is more than just web addresses. It is a map of who can do what. Doing Laravel routing right, with middleware, guards, route groups, and good folder setup, means fewer bugs. It also makes it easy to add more user roles and makes things clear for developers. Spend time here. And the rest of your app design works better.
Want to speed up your next Laravel marketplace start? Get our free route starting code to get going right away.
References
Laravel Documentation. (n.d.). Middleware. Retrieved from https://laravel.com/docs/middleware
Laravel Documentation. (n.d.). Authentication – Guards. Retrieved from https://laravel.com/docs/authentication
Stack Overflow. (2023). Stack Overflow Developer Survey 2023. Retrieved from https://survey.stackoverflow.co/2023
OWASP Foundation. (2023). Access Control Cheat Sheet. Retrieved from https://cheatsheetseries.owasp.org/cheatsheets/Access_Control_Cheat_Sheet.html