【发布时间】:2016-01-25 06:44:33
【问题描述】:
以前有人问过这个问题,我相信我的代码是正确的,但我的行为很奇怪。
我需要在登录后根据某些数据库值将用户重定向到不同的路由。我认为为了做到这一点,我只需将我的逻辑放在app/Http/Middleware/RedirectIfAuthenticated.php 的handle 方法中。我的方法目前看起来像这样:
public function handle($request, Closure $next)
{
if ($this->auth->check()) {
if($this->auth->user()->sign_up_complete == 1){
return redirect('/');
} else {
if($this->auth->user()->step_one_complete == 0){
return redirect('/register/step-1');
} elseif($this->auth->user()->step_two_complete == 0){
return redirect('/register/step-2');
} else {
return redirect('/');
}
}
}
return $next($request);
}
这不起作用,并且在登录时用户被重定向到/home。我尝试将dd($this->auth->user()) 放在$this->auth->check() 条件内,但它永远不会运行。如果我将它放在该检查之外,那么它会在每个请求上运行。看起来$this->auth->check() 从未运行过。
我的问题:如果不在这里,这个逻辑应该去哪里?
我也从AuthController.php 控制器中删除了protected $redirectTo = '/account';。
【问题讨论】:
-
check()函数在哪里 -
RedirectIfAuthenticated似乎是guest中间件。同样在Illuminate\Foundation\Auth\RedirectUsers中如果没有设置$redirectTo,会被重定向到/home。但在这种情况下没关系。您是否尝试过Authenticate中间件?在$this->auth->guest()检查之后移动你的逻辑,你写了什么。如果需要对用户进行身份验证,此中间件将每次运行。因此,如果未通过身份验证,基本检查将重定向它们。如果是,它将继续您的检查。 -
@Iamzozo 我不确定我是否遵循。这似乎完全是为了别的东西?
-
看来。如果我使用
guest中间件,它运行RedirectIfAuthenticated。但是auth中间件不是运行RedirectIfAuthenticated,而是运行Authenticate。因为您要在登录后检查用户,如果他完成了所有步骤,所有带有auth的受保护页面将运行Authenticate中间件,所以运行您的检查。guest如果您想将用户从不需要的页面重定向,则使用中间件。例如,如果用户已登录,则您不希望显示登录表单。在这里你使用guest中间件,如果他已经登录,它将调用RedirectIfAuthenticated并重定向到主页。 -
@mikemike 您是否在控制器中为
middleware编写代码?
标签: php laravel authentication laravel-5.1