Laravel多个中间件导致重定向循环

时间:2017-12-14 15:01:16

标签: php laravel middleware

我有一个auth的中间件组,我希望将另一个中间件应用于该视图中的一个特定路由,即如果配置文件未完成,则用户无法转到任何其他路由,直到他完成其配置文件并提交。

更具体地说,中间件正在导致重定向循环,因为我有2个中间件。

我用laravel php artisan创建了中间件,并检查用户是否配置文件不完整,他应该重定向到配置文件/编辑页面,但它甚至不能只检查不完整的空公司名称。

Middlware

class incompleteProfile
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(empty(Auth::user()->details['companyname'])){
            return redirect()->route('profile');
        }
        return $next($request);
    }
}

路线档案

Routes
Route::group(['middleware'=>['auth'] ], function(){


// User Profile
Route::get('/profile/edit', 'UserController@profile')->name('profile')->middleware('incompleteProfile');
Route::post('/profile/edit', 'UserController@editProfile')->name('editProfile');

2 个答案:

答案 0 :(得分:3)

如果您将该中间件放在profile路由上......他们如何才能到达profile路由以获取表单来更新配置文件以添加缺少的信息?

您说...如果公司名称的用户详细信息为空,则重定向到profile,但您在profile上有中间件......所以它将永远重定向到{{ 1}}因为中间件告诉它。在这种情况下,您的用户永远无法访问profile

这相当于将profile中间件分配到auth页面。 auth中间件检查用户当前是否已通过身份验证。这意味着如果用户未经过身份验证,他们将永远无法访问login,在这种情况下,因为login要求他们登录"。

答案 1 :(得分:0)

lagbox的回答几乎说明了为什么它不起作用的逻辑。 试试吧。

Route::group(['middleware'=>['auth'] ], function(){


// User Profile

    Route::get('/profile/edit', 'UserController@profile')->name('profile');

    Route::group(['middleware'=>['incompleteProfile'] ], function(){
      Route::post('/profile/edit', 'UserController@editProfile')->name('editProfile');
      //ETC
    });

});