PHP - проверка Laravel для первого входа в систему глобально - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь изменить 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');
}

routes/Web.php:

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

Теперь, как уже было сказано, он будет перенаправлен, только если пользователь перейдет на "/home", однако, если пользователь решит перейти, например, на "/profile", он / она не будет перенаправлен на "/onboarding".

Где наиболее подходящее место для глобальных проверок (независимо от того, какой URL у меня на сайте), если это первый логин пользователя, его / ее следует перенаправить на "/onboarding"?

1 Ответ

0 голосов
/ 04 июля 2018

Звучит так, как будто имеет смысл использовать промежуточное ПО, которое проверяет каждый запрос. Примерно так:

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

В вашем 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,
    // ...
];

Затем вы можете обернуть все маршруты, которые к нему относятся, Route::group. Вам нужно будет убедиться, что любые маршруты, такие как логин или сам маршрут onboarding, должны жить вне этого Route::group.

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

Route::group(['middleware' => ['onboarding']], function () {
    // all routes will go here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...