如何使用Laravel 5.3退出并重定向到登录页面


How to logout and redirect to login page using Laravel 5.3?

我正在使用Laravel 5.3并尝试实现身份验证系统。我使用php artisan命令make:auth来设置它。我根据我的布局编辑视图,并将其重定向到我的仪表板页面而不是主页(设置为默认设置)。现在,当我试图注销它给我这个错误

NotFoundHttpException in RouteCollection.php line 161

我在routes/web.php中的代码是:

Auth::routes();
Route::get('/pages/superadmin/dashboard', 'HomeController@index');

HomeController.php

<?php
 namespace App'Http'Controllers;
 use Illuminate'Http'Request;
 class HomeController extends Controller
 {
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('auth');
}
/**
 * Show the application dashboard.
 *
 * @return 'Illuminate'Http'Response
 */
public function index()
{
    return view('dashboard');
}
}

身份验证/登录Controller.php

<?php
namespace App'Http'Controllers'Auth;
use App'Http'Controllers'Controller;
use Illuminate'Foundation'Auth'AuthenticatesUsers;
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 = '/dashboard';
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}
}

我尝试了这个页面上的解决方案:如何设置laravel 5.3注销重定向路径?但它没有工作,并显示这些错误:

 ReflectionException in Route.php line 339:
 Class App'Http'Controllers'Auth'Request does not exist

我想把它重定向到auth/文件夹下的登录页面

在Laravel 5.4中测试

我认为最好的解决方案是重写从app/Http/Controllers/Auth/LoginController.php文件中调用的继承的"logout"方法。为此,可以向该类添加以下方法:

/**
 * Log the user out of the application.
 *
 * @param  'Illuminate'Http'Request  $request
 * @return 'Illuminate'Http'Response
 */
public function logout(Request $request)
{
    $this->guard()->logout();
    $request->session()->flush();
    $request->session()->regenerate();
    return redirect('/login');
}

由于"LoginController"类继承自Illuminate'Foundation'Auth'AuthenticatesUsers,您应该能够安全地覆盖此方法(在LoginController中)而无需编辑实际的供应商文件本身…编辑AuthenticatesUsers文件,或者任何供应商文件,如果您想要升级,将会导致严重的麻烦…

这里唯一额外的步骤是,您需要在LoginController类的顶部包含以下行:
use Illuminate'Http'Request;

我最终通过在我的LoginController.php中添加这一行来解决这个问题

 protected $redirectAfterLogout = 'auth/login';

并编辑此文件'vendor'laravel'framework'src'Illuminate'Foundation'Auth'AuthenticatesUsers.php如果你没有在这个文件中提供$redirectAfterLogout,它将使用默认的'/'。你也可以在github上找到它。链接在答案的末尾。

public function logout()
 {
  return redirect(property_exists($this, 'redirectAfterLogout') ? $this- >redirectAfterLogout : '/');
}

你也可以在这里查看:https://github.com/laravel/framework/commit/aa1204448a0d89e2846cbc383ce487df6efd9fc8#diff-b72935cc9bfd1d3e8139fd163ae00bf5

希望能帮到别人。

谢谢

如果您想继续使用GET注销

Route::get('logout', 'Auth'LoginController@logout');

Route::get('logout', ''App'Http'Controllers'Auth'LoginController@logout');

在Laravel 5.3 logouthttp post而不是http get。您可以通过post请求登出,就像Taylor Otwell在authscaffolding中所做的那样。

<a href="{{ url('/logout') }}"
    onclick="event.preventDefault();
             document.getElementById('logout-form').submit();">
    Logout
</a>
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
    {{ csrf_field() }}
</form>

将注销操作重定向到登录页面对我来说意味着除非用户经过身份验证,否则网站中没有可用的页面。

我不太喜欢像上面建议的那样触摸vendor目录。的确,Laravel 5.4 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AutenticateUser->logout()重定向到'/'。没有可用的参数来更改它。让我们保持这种方式并在路由'/' (home) 中添加一个'认证保护'

in /routes/web.phpRoute::get('/', function () { return view('home'); })->middleware('auth');

这不是最简单的方法吗?

适用于laravel 5.6
文件=> app/Http/Controllers/Auth/LoginController.php

use Illuminate'Http'Request;
class LoginController extends Controller
{
    ...  ...  ...
    ...  ...  ...
    ...  ...  ...
    /**
     * Log the user out of the application.
     *
     * @param  'Illuminate'Http'Request  $request
     * @return 'Illuminate'Http'Response
     */
    public function logout(Request $request)
    {
         $this->guard()->logout();
         $request->session()->flush();
         $request->session()->regenerate();
         return redirect('/login');
    }
}

感谢The Virtual Machinist的回答