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"?
这听起来像作为检查每个请求的中间件一样有意义.像这样的东西:
<?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)