php multiple redirectTo用于laravel scaffolding ui中的多个角色

fquxozlt  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(92)

我对我的用户有多个角色:管理员、客人和接待员
每个角色都有自己的HOME,问题是我不知道如何制作多个HOME来使每个角色重定向到自己的HOME
我想我必须在某个地方修改laravel/ui生成的auth,但我不知道如何修改它,我试图在LoginController中找到重定向路径,结果发现重定向路径存储在protected $redirectTo = RouteServiceProvider::HOME;
显然我不能做这样的事

public const HOME = '/admin';
public const HOME = '/guest';
public const HOME = '/receptionist';

请以正确的方式启发我。我是新来的laravel

bwleehnv

bwleehnv1#

在深入研究之后,我找到了一个解决方案,即覆盖trait RedirectsUsers中似乎使用的redirectTo方法
@lagbox提供的解决方案也很好用(在LoginController中添加):

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    if ($user->role === 'admin') {
        return redirect()->route('admin.analytic');
    } else if ($user->role === 'guest') {
        return redirect()->route('guest.reserve');
    } else if ($user->role === 'receptionist') {
        return redirect()->route('receptionist.booking_list');
    }
}

但我个人更喜欢这种方式(在LoginController中添加):

protected function redirectTo() {
    switch (Auth::user()->role) {
        case 'admin':
            return route('admin.analytic');
        case 'receptionist':
            return route('receptionist.booking_list');
        case 'guest':
            return route('guest.reserve');
    }
}

另外,如果用户从/login/register登录,为了重定向回用户,我需要更新RedirectIfAuthenticated中间件上的handle方法:

/**
 * Handle an incoming request.
 *
 * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
 */
public function handle(Request $request, Closure $next, string ...$guards): Response
{
    $guards = empty($guards) ? [null] : $guards;
    foreach ($guards as $guard) {
        if (Auth::guard($guard)->check()) {
            switch (Auth::user()->role) {
                case 'admin':
                    return redirect()->route('admin.analytic');
                case 'receptionist':
                    return redirect()->route('receptionist.booking_list');
                case 'guest':
                    return redirect()->route('guest.reserve');
            }
        }
    }

    return $next($request);
}

感谢@Thush-Fdo和@lagbox帮助我!

相关问题