dpjjmo3079 2018-04-12 13:28
浏览 44
已采纳

Laravel路线:在auth中间件中击中路线时断开

I am writing the logic in which the user accepts Terms and Conditions in a separate page and here is the workflow.

  1. The user is logged in
  2. If they have not accepted the latest Terms and Conditions, show them the /welcome page.
  3. If they accept them, then there is a link redirecting them to /accept

I have got the following routes set up:

Auth::routes();

// Temp
Route::get('/', function () {
    return redirect('/login');
});

Route::get('/logout', 'Auth\LoginController@logout');

Route::post('password/reset/{token}', 'Auth\ResetPasswordController@postReset')->name('password.request');

// Auth middleware
Route::group(['middleware' => ['auth']], function () {
    // Temp
    Route::get('/discovery', function () {
        return view('pages.discovery');
    });

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

    Route::get('/accept', 'Auth\LoginController@accept');
});

Issue is that when a user is logged in, redirected to the /welcome page instead of them clicking on the Accept button to be redirected to the /accept route then it breaks with the common message Sorry, the page you are looking for could not be found.

I am guessing it's related to middleware. Any ideas?

Update

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

    Route::get('/accept', 'Auth\LoginController@accept')->name('terms.accept');
    Route::get('/welcome', function () {
        return view('pages.welcome');
    });
    Route::group(['middleware' => ['terms']], function () {
        Route::get('/discovery', function () {
            return view('pages.discovery');
        });

    });
});

and this is the middleware:

class TermsMiddleware
{
    /**
     * @var UserService
     */
    protected $userService;

    /**
     * TermsMiddleware constructor.
     * @param UserService $userService
     */
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!$this->userService->hasAcceptedTerms()) {
            return redirect('/welcome');
        }

        return $next($request);
    }
}
  • 写回答

1条回答 默认 最新

  • dounuo9921 2018-04-12 13:40
    关注
    Auth::routes();
    
    Route::get('/', function () {
        return redirect('/login');
    });
    
    Route::get('/logout', 'Auth\LoginController@logout');
    Route::post('password/reset/{token}', 'Auth\ResetPasswordController@postReset')->name('password.request');
    
    Route::group(['middleware' => ['auth']], function () {
        Route::get('/accept', 'Auth\LoginController@accept')->name('get.accept');
        Route::group(['middleware' => ['terms']], function () {
            Route::get('/discovery', function () {
                return view('pages.discovery');
            });
            Route::get('/welcome', function () {
                return view('pages.welcome');
            });
        });
    });
    

    php artisan make:middlware Terms

    <?php
    
    namespace YourNamespace;
    
    use Closure;
    
    class Terms
    {
    
        public function handle( $request, Closure $next, $guard = null )
        {
            if( ! $request->user()->accepts_terms ) {
                return redirect( route( 'get.accept' ) );
            }
            return $next( $request );
        }
    }
    

    add to your HTTP kernel routeMiddleware, 'terms' => YourNewTermsMiddleware::class

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试