简体   繁体   English

Laravel路由:在身份验证中间件中点击路由时中断

[英]Laravel routes: Breaking when hitting a route in auth middleware

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. 如果他们没有接受最新的条款和条件,请向他们显示/welcome页面。
  3. If they accept them, then there is a link redirecting them to /accept 如果他们接受它们,那么会有一个链接将他们重定向到/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. 问题是,当用户登录后,重定向到/welcome页面,而不是他们单击“接受”按钮重定向到/accept路由,然后它与常见消息“ Sorry, the page you are looking for could not be found.一起中断, 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);
    }
}
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 artisan make:middlware条款

<?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 添加到您的HTTP内核routeMiddleware,'terms'=> YourNewTermsMiddleware :: class

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM