Laravel 5.8多次重定向您,中间件问题

时间:2019-05-02 09:29:03

标签: php laravel middleware laravel-5.8

我有一条注册路线。在第一步上注册后,它将通过电子邮件发送给用户以验证其帐户并在其电子邮件上具有链接。单击链接后,它应重定向到signup/step2,并完成操作,他可以​​访问job-seeker/home

因此逻辑是完成注册后,用户无法再次访问signup/step2,因为用户已经完成填写表格。 并且在填充signup/step2之前,他也无法访问job-seeker/home。反之亦然。

基本上,我的中间件首先是:检查用户是否完成了step2并在数据库的is_completed列上添加了true。然后在第二种中间件上,只能按角色访问他的路线,他无法访问其他角色的其他路线,并根据他的角色重定向到他的家。

但是,即使我仍然没有填写step2,它也会引发太多重定向和切换。这是我的下面的gif。

enter image description here


我的代码

Kernel.php

class Kernel extends HttpKernel
{
    ...
    protected $routeMiddleware = [
        ...
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'isCompleted' => \App\Http\Middleware\IsCompleted::class,
    ];

Middleware / IsCompleted.php

class IsCompleted
{
    public function handle($request, Closure $next)
    {
        if(auth()->user()->isCompleted == 1){
            return $next($request);
        }

        // if 0, redirect to step2
        return redirect()->route('register.step2');
    }

中间件/RedirectIfAuthenticated.php

use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            if ( Auth::user()->hasRole('job-seeker') ) {
                return redirect()->route('job-seeker.home');
            } else if(Auth::user()->hasRole('admin')) {
                return redirect()->route('admin.home');
            }
        }

        return $next($request);

Routes / Web.php

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::group(['middleware' => ['verified', 'isCompleted']], function() {
    Route::group(['prefix' => 'admin', 'name' => 'admin.'], function() {
        Route::get('/home', function(){ return "test"; })->name('admin.home');
    });

    Route::group(['prefix' => 'job-seeker', 'name' => 'job-seeker.'], function() {
        Route::get('/home',         'Jobseeker\HomeController@index')->name('job-seeker.home');
    });
});

Auth::routes(['verify' => true, 'register' => false]);
Route::get('signup/{usertype}'      , 'Auth\RegisterController@getStep1')->name('register.step1');
Route::post('signup/{usertype}'     , 'Auth\RegisterController@postStep1');

Route::group(['middleware' => ['auth']], function() {
    Route::get('signup/step2'       , 'Auth\RegisterController@getStep2')->name('register.step2');
    Route::post('signup/step2'      , 'Auth\RegisterController@postStep2');
});

编辑1

我检查页面并转到“网络”选项卡,这就是结果。

enter image description here

1 个答案:

答案 0 :(得分:0)

您的RedirectIfAuthenticated始终保持重定向。对于经过身份验证的用户,它永远不会到达$next($request)

您需要具有类似的逻辑

if (route is seeker.home and user can visit seeker.home) {
    return $next(request);
}

代替

return redirect()->route('job-seeker.home');