W domyślnej konfiguracji Laravel 11 nie ma na sztywno ustawionej wartości przekierowania.
Sam Laravel sprawdza w Middleware, które jest uruchamiane, jeśli użytkownik jest już zalogowany, czy istnieją trasy o nazwie dashboard lub home. Jeśli taka trasa istnieje, użytkownik zostanie do niej przekierowany. W przeciwnym razie, Laravel przekierowuje do korzenia.
src/Illuminate/Auth/Middleware/RedirectIfAuthenticated.php:
class RedirectIfAuthenticated
{
// ...
protected function defaultRedirectUri(): string
{
foreach (['dashboard', 'home'] as $uri) {
if (Route::has($uri)) {
return route($uri);
}
}
$routes = Route::getRoutes()->get('GET');
foreach (['dashboard', 'home'] as $uri) {
if (isset($routes[$uri])) {
return '/'.$uri;
}
}
return '/';
}
}
Więc najpierw musisz mieć swoją własną logikę.
Załóżmy, że twoja logika będzie wewnątrz modelu User, tak jak tutaj:
app/Models/User.php:
class User extends Authenticatable
{
// ...
public function getRedirectRoute()
{
return match((int)$this->role_id) {
1 => 'student.dashboard',
2 => 'teacher.dashboard',
// ...
};
}
}
Następnie musisz utworzyć swoje Middleware z logiką i przypisać mu ten sam alias, w tym przypadku guest.
php artisan make:middleware OnlyGuestAllowedMiddleware
app/Middleware/OnlyGuestAllowedMiddleware.php:
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class OnlyGuestAllowedMiddleware
{
public function handle(Request $request, Closure $next, string ...$guards): Response
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(Auth::user()->getRedirectRoute());
}
}
return $next($request);
}
}
bootstrap/app.php:
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/..'.'/routes/web.php',
commands: __DIR__.'/..'.'/routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'guest' => \App\Http\Middleware\OnlyGuestAllowedMiddleware::class
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
W Laravel Breeze musisz zmienić w dwóch miejscach oddzielnie: kontroler Rejestracji i Logowania.
app/Http/Controllers/Auth/RegisteredUserController.php:
public function store(Request $request): RedirectResponse
{
// ...
Auth::login($user);
return redirect(route('dashboard', absolute: false));
}
Zmień ostatnią linię na:
return redirect(auth()->user()->getRedirectRoute());
A potem kontroler Logowania.
app/Http/Controllers/Auth/AuthenticatedSessionController.php:
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(route('dashboard', absolute: false));
}
Zmień ostatnią linię na:
return redirect()->intended(auth()->user()->getRedirectRoute());
Podsumowując, artykuł pokazuje, jak dostosować Laravel Breeze do indywidualnych potrzeb, umożliwiając różne przekierowania po zalogowaniu/rejestracji w zależności od roli użytkownika.