Php Laravel 5.5登录表单在每个页面上刷新,而不是重定向
对于需要登录/注册系统和大量CRUD操作的web项目,我选择学习Laravel。我在学校有一些MVC.NET和Spring的经验,虽然有很多相似之处,但有些东西有点不同。。。这个项目的要求是,它有一个登录表单在每个页面时,没有登录(客人)。该表单在登录(auth)时更改为用户的“配置文件”。我遇到的问题是,当我登录并尝试使用RedirectIfAuthenticated中间件重定向时,出于某种原因,我进入了一个无限的重定向循环。是否有一种解决方案可以在每个页面上创建一个登录表单,而不是重定向到另一个视图,只需刷新页面并使用Blade的模板引擎设置正确的值? 我已经用Php Laravel 5.5登录表单在每个页面上刷新,而不是重定向,php,authentication,redirect,laravel-5,Php,Authentication,Redirect,Laravel 5,对于需要登录/注册系统和大量CRUD操作的web项目,我选择学习Laravel。我在学校有一些MVC.NET和Spring的经验,虽然有很多相似之处,但有些东西有点不同。。。这个项目的要求是,它有一个登录表单在每个页面时,没有登录(客人)。该表单在登录(auth)时更改为用户的“配置文件”。我遇到的问题是,当我登录并尝试使用RedirectIfAuthenticated中间件重定向时,出于某种原因,我进入了一个无限的重定向循环。是否有一种解决方案可以在每个页面上创建一个登录表单,而不是重定向到另
php-artisan-make:auth
命令创建了这个基础,并自己做了一些更改。我将在相应的类中发布我所拥有的一些片段
让我们了解一下它的外观以及为什么每页都需要一个表单:(顺便说一句,我把它放在layouts/app.blade.php的页脚中。
Routes/web.php:
我将Facade Auth::routes()解压到这个位置,以便进行更改。我暂时离开了登录,但当我的东西正常工作时,它应该消失了。我写的下面两条注释
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没有区别):
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
@if(Auth::guest())
//忽略登录表单。。。
@否则
登录!
{{csrf_field()}}
@恩迪夫
如果你需要更多信息,请告诉我。
提前感谢。在您的
web.php
路由文件中,您两次声明了主路由:
Route::get('/', 'HomeController@index')->name('home');
Route::get('home', 'HomeController@index')->name('home');
我想换成:
Route::get('/', 'HomeController@index')->name('home');
然后在登录控制器中
需要更新$redirectTo
以反映该更改。因此:
protected $redirectTo = '/';
对于您的redirectifiauthenticated
中间件也一样:
if (Auth::guard($guard)->check()) {
return redirect('/');
}
最后但并非最不重要的一点是,您的HomeController
中间件不正确。guest
用于仅在未经身份验证时才可访问的路由,例如登录、注册或忘记密码。但是,由于您希望HomeController
的路由仅可由经过身份验证的用户访问,因此您必须更改到auth
的中间件:
public function __construct()
{
$this->middleware('auth');
}
这似乎有效。唯一的问题是,当我单击注销链接时,它会按预期注销,但会重定向到/登录。知道在哪里更改此重定向吗?而且,当我登录时,我也可以访问主页、团队页面等,但一旦我注销,我就无法再访问它们了……更具体地说,我想成为所有可访问的页面可用于guest和auth,但只需更改底部的登录名…这就是为什么我会与guest/auth混淆,因为它只是注销重定向路径的一部分:您可以在
LoginController
中更改,方法是更改其中的。如果我理解正确,您希望HomeController
中的所有内容都正确可供经过身份验证和未经身份验证的用户访问?在这种情况下,您应该既不指定guest
也不指定auth
中间件。
public function __construct()
{
$this->middleware('auth');
}