【问题标题】:Laravel routes: Breaking when hitting a route in auth middlewareLaravel 路由:在 auth 中间件中击中路由时中断
【发布时间】:2018-09-22 16:24:28
【问题描述】:

我正在编写用户在单独页面中接受条款和条件的逻辑,这是工作流程。

  1. 用户已登录
  2. 如果他们尚未接受最新的条款和条件,请向他们展示/welcome 页面。
  3. 如果他们接受了,就会有一个链接将他们重定向到/accept

我设置了以下路线:

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');
});

问题是,当用户登录时,重定向到 /welcome 页面,而不是点击接受按钮以重定向到 /accept 路由,然后它会中断常见消息 Sorry, the page you are looking for could not be found.

我猜它与中间件有关。有什么想法吗?

更新

// 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');
        });

    });
});

这是中间件:

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);
    }
}

【问题讨论】:

  • 您能否分享您的页面目录以及您在 LoginController 中所做的更改。
  • 更新了我的问题!
  • 不要忘记控制器,它是弄清楚它为什么会在其中损坏的重要部分。

标签: php laravel authentication middleware


【解决方案1】:
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 术语

<?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 );
    }
}

添加到您的 HTTP 内核 routeMiddleware, 'terms' => YourNewTermsMiddleware::class

【讨论】:

  • 看起来非常接近我正在寻找的东西!很快就会回来
  • 好的,/login 路由现在正在中断,但总的来说看起来非常接近我想要实现的目标
  • 不抱歉,我想我知道发生了什么。
  • 完美解决方案,@Luke Snowden。接受为答案!
  • 顺便说一句,当我将用户重定向到/accept、@Luke Snowden 时,它似乎当前失败了。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2021-11-23
  • 2017-07-04
  • 1970-01-01
  • 2016-12-09
  • 2020-12-09
  • 2019-06-09
相关资源
最近更新 更多