Laravel 登录后将管理员重定向到仪表板

Laravel 登录后将管理员重定向到仪表板,laravel,laravel-5,laravel-5.2,Laravel,Laravel 5,Laravel 5.2,我需要在管理员用户登录后将其重定向到仪表板。为了实现这一点,我重写了位于RedirectUserstrait中的redirectPath()方法。代码如下: 公共函数重定向路径() { 如果(属性_存在($this,'redirectPath')){ 返回$this->redirectPath; } //修改------------------------------ if(request()->user()->hasRole('admin')){ 返回“/仪表板”; } //末端修饰-----

我需要在管理员用户登录后将其重定向到仪表板。为了实现这一点,我重写了位于
RedirectUsers
trait中的
redirectPath()
方法。代码如下:

公共函数重定向路径()
{
如果(属性_存在($this,'redirectPath')){
返回$this->redirectPath;
}
//修改------------------------------
if(request()->user()->hasRole('admin')){
返回“/仪表板”;
}
//末端修饰---------------------------
返回属性_存在($this,'redirectTo')?$this->redirectTo:'/home';
}
问题 仪表板重定向仅在某些情况下有效

  • 在第一次登录时,管理员被重定向到主页
  • 在随后的登录中,管理员被重定向到仪表板
  • 但如果运行了
    php-artisan-cache:clear
    命令,admin将再次重定向到主页

为什么会发生这种情况以及如何正确实现此功能?

您可以在
AuthController.php
中创建
authenticated
方法,而不是覆盖
redirectPath()
,如果用户成功通过身份验证后存在此方法,则将调用它:

class AuthController extends Controller

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    ...

    public function authenticated()
    {
        if(Auth::guard($this->getGuard())->user()->hasRole('admin')){
            return redirect('/dashboard');
        }

        return redirect()->intended($this->redirectPath());
    }
}

您可以在
AuthController.php
中创建
authenticated
方法,而不是重写
redirectPath()
,如果在用户成功身份验证后存在该方法,则将调用该方法:

class AuthController extends Controller

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    ...

    public function authenticated()
    {
        if(Auth::guard($this->getGuard())->user()->hasRole('admin')){
            return redirect('/dashboard');
        }

        return redirect()->intended($this->redirectPath());
    }
}
中间件呢

创建一个名为RedirectIfAdmin的中间件

然后将其放入Homecontroller结构中

我想这可能更像是拉威尔的想法。

中间件怎么样

创建一个名为RedirectIfAdmin的中间件

然后将其放入Homecontroller结构中


我想这可能更像拉威尔的想法。

永远不要更改供应商文件夹中的任何文件

当您尝试更新软件包时,它将导致问题,因为它将覆盖所有旧的软件包!此外,默认情况下,git不会跟踪供应商文件夹中的任何文件

以下是备选方案
及其工作原理:

AuthController.php

class AuthController extends Controller {

  protected $redirectTo = '/user/dashboard';

}
然后,在控制器中,您可以执行以下操作:

if(Auth::guard($this->getGuard())->user()->hasRole('admin')){
    $this->redirectTo = '/dashboard'
}
将会发生什么:

public function redirectPath()
{
    if (property_exists($this, 'redirectPath')) {
        return $this->redirectPath;
    }

    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

每当调用
redirectPath
函数的任何方法都会检查
redirectPath
的属性是否存在。如果存在,请使用提供的url。如果没有,请使用默认值“/home”

不要更改供应商文件夹中的任何文件

当您尝试更新软件包时,它将导致问题,因为它将覆盖所有旧的软件包!此外,默认情况下,git不会跟踪供应商文件夹中的任何文件

以下是备选方案
及其工作原理:

AuthController.php

class AuthController extends Controller {

  protected $redirectTo = '/user/dashboard';

}
然后,在控制器中,您可以执行以下操作:

if(Auth::guard($this->getGuard())->user()->hasRole('admin')){
    $this->redirectTo = '/dashboard'
}
将会发生什么:

public function redirectPath()
{
    if (property_exists($this, 'redirectPath')) {
        return $this->redirectPath;
    }

    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

每当调用
redirectPath
函数的任何方法都会检查
redirectPath
的属性是否存在。如果存在,请使用提供的url。如果没有,请使用默认值“/home”

谢谢,但没有任何更改永远不要更改供应商文件中的任何内容。它将在以后更新时引起问题package@geckob你为什么否决我的答案?谁更改了供应商文件夹中的文件?我们从未更改过供应商文件夹中的任何内容,我们只是在
app\Http\Controllers\Auth
中的
AuthController.php
上进行更改,使用
AuthenticatesAndRegistersUsers
ThrottlesLogins
traits@geckob你太有趣了!似乎您不知道,只需在类上创建一个同名的方法,就可以覆盖trait的方法。@RifkiAriaGumelar:当时我错了。我知道这是可能的。但我以为你的意思是相反的。但我仍然不认为这是解决问题的方法。你能修改一下你的答案吗?这样我就可以修改了。现在,它被锁定了,但没有任何更改。永远不要更改供应商文件中的任何内容。它将在以后更新时引起问题package@geckob你为什么否决我的答案?谁更改了供应商文件夹中的文件?我们从未更改过供应商文件夹中的任何内容,我们只是在
app\Http\Controllers\Auth
中的
AuthController.php
上进行更改,使用
AuthenticatesAndRegistersUsers
ThrottlesLogins
traits@geckob你太有趣了!似乎您不知道,只需在类上创建一个同名的方法,就可以覆盖trait的方法。@RifkiAriaGumelar:当时我错了。我知道这是可能的。但我以为你的意思是相反的。但我仍然不认为这是解决问题的方法。你能修改一下你的答案吗?这样我就可以修改了。现在,它被锁定了。我添加了一个答案作为另一个备选答案。我添加了一个答案作为另一个备选答案。我不会更改供应商文件夹中的任何内容,但无论如何,感谢您的建议。我曾经尝试过这种方法,正如我的问题中所指出的,但有时却没有work@AlexanderLomia:真的吗?我很高兴知道它什么时候不起作用。我不会更改供应商文件夹中的任何内容,不过还是谢谢你的建议。我曾经尝试过这种方法,正如我的问题中所指出的,但有时却没有work@AlexanderLomia:真的吗?我非常高兴知道它什么时候不起作用