Perhaps, a single /dashboard endpoint served by an invokable Controller with protected/private methods for each role, e.g.
Route::get('dashboard', DashboardController::class)
->middleware('auth')
->name('dashboard');
class DashboardController
{
public function __invoke(Request $request)
{
$role = auth()->user()->role ?? 'user';
abort_unless(method_exists($this, $role), 400);
return $this->{$role}();
}
private function superadmin()
{
// organize data for SuperAdmin dashboard
return view('dashboards.superadmin', ['data' => $data]);
}
private function admin()
{
// organize data for Admin dashboard
return view('dashboards.admin', ['data' => $data]);
}
// ... etc
}
The views directory structure would look like this:
views
|-- dashboards
|--|-- superadmin.blade.php
|--|-- admin.blade.php
|--|-- member.blade.php
|--|-- user.blade.php
I think I would find this approach easily discoverable from the point-of-view of the developer. Furthermore, any user is just seeing a /dashboard URI which doesn't indicate anything about other dashboards for the other roles