Update: I cleared the cache, logged out and the login link is now visible.
Login link not showing on Laravel welcome screen
Hi,
I'm trying to create a dashboard for the user, the vendor, and the admin for a multi-vendor website I'm building. Inside the views folder I created an admin folder and a vendor folder. Each folder contains a dashbaord.blade.php file. Following the changes I made below, I can longer access the login page from the Laravel welcome screen when I visit: http://127.0.0.1:8001/
I've this code inside the RouteServiceProvider.php file:
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to your application's "home" route.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/dashboard';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*/
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
Route::middleware(['web', 'auth', 'role:admin'])
->prefix('admin')
->as('admin.')
->group(base_path('routes/admin.php'));
Route::middleware(['web', 'auth', 'role:vendor'])
->prefix('vendor')
->as('vendor.')
->group(base_path('routes/vendor.php'));
});
}
}
The RoleMiddleware.php file contains the following:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class RoleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next,$role): Response
{
if($request->user()->role !== $role){
if($request->user()->role == 'vendor'){
return redirect()->route('vendor.dashbaord');
}elseif ($request->user()->role == 'admin'){
return redirect()->route('admin.dashbaord');
}else {
return redirect()->route('user.dashboard');
}
}
return $next($request);
}
}
I added this to the Kernel.php file:
'role' => \App\Http\Middleware\RoleMiddleware::class,
The AuthenticatedSessionController.php file contains this:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*/
public function create(): View
{
return view('auth.login');
}
/**
* Handle an incoming authentication request.
*/
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
if($request->user()->role === 'admin') {
return redirect()->intended('/admin/dashboard');
} elseif($request->user()->role === 'vendor') {
return redirect()->intended('/vendor/dashboard');
}
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*/
public function destroy(Request $request): RedirectResponse
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}
The admin.php file contains this:
<?php
use App\Http\Controllers\AdminController;
use Illuminate\Support\Facades\Route;
/** Admin Routes */
Route::get('dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
The vendor.php file contains this:
<?php
use App\Http\Controllers\VendorController;
use Illuminate\Support\Facades\Route;
/** Vendor Routes */
Route::get('dashboard', [VendorController::class, 'dashboard'])->name('dashboard');
The AdminController.php file contains this:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class AdminController extends Controller
{
public function dashboard()
{
return view('admin.dashboard');
}
public function login()
{
return view('admin.auth.login');
}
}
The vendor.php file contains this:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class VendorController extends Controller
{
public function dashboard()
{
return view('vendor.dashboard');
}
}
The web.php contains this (created by Breeze):
/** Laravel Breeze routes */
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
require __DIR__ . '/auth.php';
Grateful for your guidance.
@mamunsson Add the middleware role:user to the route group for user
Route::middleware(['auth', 'verified', 'role:user'])
->prefix('user')
->name('user.')
->group(function () {
Route::get('dashboard', [UserDashboardController::class, 'index'])->name('dashboard');
Route::get('profile', [UserProfileController::class, 'index'])->name('profile');
});
Please or to participate in this conversation.