簡體   English   中英

每個頁面上的Laravel 5.5登錄表單,刷新而不是重定向

[英]Laravel 5.5 login form on every page, refresh instead of redirect

對於需要登錄/注冊系統和大量CRUD操作的Web項目,我選擇學習Laravel。 我從學校學習過MVC .NET和Spring的經驗,盡管有很多相似之處,但有些地方有些不同...該項目的要求是,未登錄時每個頁面上都有一個登錄表單(客人)。 登錄(身份驗證)后,該表格將更改為用戶的“個人資料”。 我遇到的問題是,當我登錄並嘗試使用中間件RedirectIfAuthenticated進行重定向時,由於某種原因,我陷入了無限循環重定向。 是否有解決方案可在每個頁面上創建登錄表單,而不是重定向到另一個視圖,而只需使用Blade的模板引擎刷新頁面並設置正確的值即可? 我已經使用php artisan make:auth命令創建了基礎,並且自己進行了一些更改。 我將發布有關上等班的摘要。

為了說明它的外觀以及為什么每個頁面上都需要一個表單:(順便說一句,我將其放在layouts / app.blade.php的頁腳中。 示例圖片

Routes / web.php:我將Facade Auth :: routes()解壓縮到此,以便進行更改。 我暫時離開了登錄名,但是當我工作正常時,它應該消失了。 我忽略了最下面的2條評論。

Route::get('/', 'HomeController@index')->name('home');
Route::get('home', 'HomeController@index')->name('home');

Route::get('teams', 'HomeController@teams')->name('teams');
Route::get('schedules', 'HomeController@schedules')->name('schedules');
Route::get('tables', 'HomeController@tables')->name('tables');
Route::get('rules', 'HomeController@rules')->name('rules');

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...

// Password Reset Routes...

HomeController.php

在這里,我懷疑構造函數中的配置是作為中間件作為“ guest”還是“ auth”?

    class HomeController extends Controller
    {
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Show the homepage.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('home');
    }

    //other pages omitted
    }

LoginController.php(與artisan auth相同):

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

RedirectIfAuthenticated.php:

class RedirectIfAuthenticated
{
    /**
     * 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)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('home');
        }

        return $next($request);
    }
}

App.blade.php:

@if (Auth::guest())

    //login form omitted ...

@else

   <!-- TODO: check for role & display correct nav -->
   <h2>Logged in!</h2>

  <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
      {{ csrf_field() }}
  </form>
 @endif

告訴我是否需要更多信息。 提前致謝。

web.php路由文件中,您兩次聲明了本地路由:

Route::get('/', 'HomeController@index')->name('home');
Route::get('home', 'HomeController@index')->name('home');

我將其更改為:

Route::get('/', 'HomeController@index')->name('home');

然后,在LoginController您需要更新$redirectTo以反映該更改。 所以:

protected $redirectTo = '/';

與您的RedirectIfAuthenticated中間件相同:

if (Auth::guard($guard)->check()) {
    return redirect('/');
}

最后但並非最不重要的一點是,您的HomeController中間件不正確。 guest用於僅在未經身份驗證的情況下才能訪問的路由,例如登錄,注冊或忘記密碼。 但是,由於您希望只有經過身份驗證的用戶才能訪問HomeController的路由,因此您必須將中間件更改為auth

public function __construct()
{
    $this->middleware('auth');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM