[英]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.