为什么在 Laravel 中的注销路由不起作用?

Why does not work logout route in Laravel?

当我尝试从管理面板注销时出现错误:

MethodNotAllowedHttpException in RouteCollection.php line 218:

但是路由里面有路由logout:

POST | logout |  App\Http\Controllers\Auth\LoginController@logout | web  

我该如何解决这个问题?

您正在尝试使用 GET 访问 POST 路由。

你可以:
- 使用 POST
创建一个 ajax 请求 - 将按钮包装成 POST-form
- 创建一个额外的 GET-路由到 App\Http\Controllers\Auth\LoginController@logout

您正在对 POST 路由执行 GET 请求。创建或修改现有路由以接受 GET 请求(通过 link 的重定向是 GET 请求(大部分时间))

是您在 Auth 文件夹或 Controllers 文件夹中的 LoginController.. 也许你给了一条错误的道路.. 如果 LoginController 在 Controllers 文件夹中,路径应该是 路线::获取('logout', 'App\Http\Controllers\LoginController@logout');

您需要完成以下步骤:

1.- 如果您正在使用您创建的 class 登录,请在 config/auth 中指定它。php:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Administrator::class,
    ],
],

2.- 您的模型必须继承自 class Authenticatable:

use Illuminate\Foundation\Auth\User as Authenticatable;
class Administrator extends Authenticatable{
    #code...
}

3.- 在您的登录控制器上添加 logout() 函数,导入 AuthRedirect classes

public function logout(){
    Auth::logout();
    return Redirect::to('admin');
}

3.- 指定您将用于通过 GET

注销的路由
Route::get('logout','LoginController@logout');

就这些了,这应该行得通。

注意: 检查您是否通过函数 Auth::check()

进行身份验证

附加信息: 当您处理 POST 请求时,Laravel 需要验证该请求不是恶意请求,为此 Laravel需要一个加密代码,这个叫做csrf_token,如果你不发送这个,默认情况下你的所有请求都不会被允许。

如果您已升级到 Laravel 5.3,在升级期间有意删除了获取注销路由。

POST To Logout

The Auth::routes method now registers a POST route for /logout instead of a GET route. This prevents other web applications from logging your users out of your application. To upgrade, you should either convert your logout requests to use the POST verb or register your own GET route for the /logout URI

https://laravel.com/docs/5.3/upgrade

您需要将所有注销链接更改为表单,以便它可以 POST 到路由。来自 https://github.com/acacha/adminlte-laravel/issues/94,类似于:

<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>

Source

替换

<a href="{{ url('/logout') }}" class="btn btn-default btn-flat">{{ trans('adminlte_lang::message.signout') }}</a>

<a href="{{ url('/logout') }}" class="btn btn-default btn-flat" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> {{ trans('adminlte_lang::message.signout') }} </a>

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

在 mainheader.blade.php 中它会修复。

只需将其添加到路由文件即可:

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