PHP - Laravel检查全球首次登录

oli*_*rbj 1 php laravel laravel-5

我正在尝试修改Laravel,因此它将检查登录用户之前是否已登录,无论他们在首次登录时将导航到哪个页面.

目前,如果用户"/home"在首次登录时被重定向,我只能让它工作:

UserController.php:

   public function index()
    {
        $user = Auth::user();
        if (!$user->last_login){
             //This will redirect the user to the onboarding area, if they haven't logged in before.
             return redirect()->route('onboarding');

        }else{

            if ($user->isAdmin()) {
                return view('pages.admin.home');
            }

            return view('pages.user.home');
        }
    }
public function onboarding(){
    //If the user hasn't logged in yet, let's onboard him/her
    //Please check function index(), for the actual redirect.
    return view('onboarding.home');
}
Run Code Online (Sandbox Code Playgroud)

routes/Web.php:

//Onboarding
    Route::get('/onboarding', 'UserController@Onboarding')->name('onboarding');
Run Code Online (Sandbox Code Playgroud)

现在如上所述,它只会在用户导航时重定向"/home",但是如果用户决定去,例如"/profile",他/她将不会被重定向到"/onboarding".

在哪里是最适合全球检查的地方(无论我的网站上有什么网址),如果是用户首次登录,他/她应该被重定向到"/onboarding"

Ale*_*ris 6

这听起来像作为检查每个请求的中间件一样有意义.像这样的东西:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfFirstLogin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        $user = Auth::user();
        if (!$user->last_login){
             //This will redirect the user to the onboarding area, if they haven't logged in before.
             return redirect()->route('onboarding');
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的Kernel.php,您将需要注册的路线:

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    // ...
    'onboarding' => \App\Http\Middleware\RedirectIfFirstLogin::class,
    // ...
];
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用a包装适用于它的所有路由Route::group.您需要确保任何路线(例如登录或onboarding路线本身)都需要在此之外生活Route::group.

Route::get('/onboarding', 'UserController@Onboarding')->name('onboarding');

Route::group(['middleware' => ['onboarding']], function () {
    // all routes will go here.
}
Run Code Online (Sandbox Code Playgroud)