Zmiana przekierowania po zalogowaniu/rejestracji w Laravel Breeze

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.