Laravel 5.4を使用して、認証システムを実装しようとしています。 php artisanコマンドmake:authを使用してセットアップしました。レイアウトに従ってビューを編集しました。さて、ログアウトしようとすると、このエラーがスローされます
RouteCollection.php行161のNotFoundHttpException:
ログアウト方法を教えてください。
web.php
(ルート):
追加:
Route::get('logout', '\App\Http\Controllers\Auth\LoginController@logout');
あなたのLoginController.php
追加:
public function logout(Request $request) {
Auth::logout();
return redirect('/login');
}
また、LoginController.php
の上部、namespace
の後
追加:
use Auth;
use Illuminate\Http\Request;
これで、yourdomain.com/logout
URLを使用してログアウトするか、logout button
を作成した場合は、/logout
にhrefを追加できます。
たとえ@Taurasが示唆することがうまくいくとしても、これに対処する正しい方法だとは思わない。
php artisan make:auth
ルーティングファイルにAuth::routes();
を挿入する必要があるroutes/web.php
を実行しました。デフォルトのlogout
ルートが既に定義されており、logout
という名前が付いています。
GitHubでご覧ください が可能ですが、簡単にするためにここでもコードを報告します。
/**
* Register the typical authentication routes for an application.
*
* @return void
*/
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
}
次に、HTTP要求メソッドとしてlogout
requiresPOST
に注意してください。これには多くの正当な理由がありますが、非常に重要なことは、この方法でクロスサイトリクエストフォージェリーを防ぐことができるということです。
したがって、私が指摘したところによると、これを実装する正しい方法は次のようになります。
<a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();">
Logout
</a>
<form id="frm-logout" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
最後に、laravelをすぐに使える関数{{ csrf_field() }}
から挿入したことに注意してください!
コントローラで次を使用できます。
return redirect('login')->with(Auth::logout());
ルートでAuth :: logout()を呼び出すことでそれを行う別の方法があります
Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});
5.5で
追加
Route::get('logout', 'Auth\LoginController@logout');
私のroutesファイルには問題なく動作します。
Web.phpのLaravel authルートに固執することをお勧めします:Auth::routes()
次のルートを作成します。
POST | logout | App\Http\Controllers\Auth\LoginController@logout
POSTフォームを使用してログアウトする必要があります。この方法では、推奨されるCSRFトークンも必要になります。
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">Logout</button>
</form>
Laravel 5.8の最良の方法
100%働いた
Auth\LoginController.php内にこの関数を追加します
use Illuminate\Http\Request;
そしてこれも追加します
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return $this->loggedOut($request) ?: redirect('/login');
}