【问题标题】:Laravel 5.4.24 throws MethodNotAllowedHttpException during logout of usersLaravel 5.4.24 在用户注销期间抛出 MethodNotAllowedHttpException
【发布时间】:2017-06-23 08:15:07
【问题描述】:

我正在开发 Laravel 5.4.24 中的身份验证系统。尝试注销时,我的浏览器出现错误:第 251 行的 RouteCollection.php 中的 MethodNotAllowedHttpException

routes文件夹中web.php中的注销路由为:

Route::post('logout', 'Auth\LoginController@logout')->name('logout'); 

控制器存储的app/Http/LoginController.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 = '/';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

更新问题 下面的代码是我的 login.blade.php

@extends('main')

@section('title', '| login')

@section('content')
    <div class='row'>
        <div class='col-md-6 col-md-offset-3'>
            {!! Form::open() !!}

                {{ Form::label('email', 'Email:') }}
                {{  Form::email('email', null, ['class' => 'form-control']) }}

                {{  Form::label('password', 'Password:') }}
                {{  Form::password('password', ['class' => 'form-control'])  }}

                <br>
                {{  Form::checkbox('remember') }} {{  Form::label('remember', 'Remember Me:') }}

                <br>
                {{  Form::submit('Login', ['class' => 'btn btn-primary btn-block']) }}


            {!!  Form::close()  !!}
        </div>
    </div>

@endsection

ma​​in.blade.php

<!DOCTYPE html>
<html lang="en">
<!-- Connection to the partials called _head.blade.php -->
@include('partials._head')
<body>

    @include('partials._nav')

    <!-- The below class container holds all body content-->
    <div class='container'>

        @include('partials._messages')

        {{ Auth::check() ? "Logged In" : "Logged Out"}}

        @yield('content')

        @include('partials._footer')
    </div> <!-- End of container -->

    @include('partials._javascript')
    @yield('scripts')
</body>
</html>

【问题讨论】:

  • 您能说明一下您是如何调用注销链接的吗?
  • @AlessandroMinoccheri 因为我使用 localhost 并将 laravel 保存在名为 sampleBlog 的目录中:我正在输入:localhost/sampleBlog/logout
  • @Patwan 这个 url localhost/sampleBlog/logout 是 get 方法,但在你的路由中定义是 post 方法

标签: php laravel-5.4


【解决方案1】:

只需将此行添加到您的 routes/web.php

Route::get('/logout', 'Auth\LoginController@logout')-&gt;name('logout' );

这可以完美地修复它,而无需添加任何杂乱的代码。

【讨论】:

  • 如果您想使用 get 方法注销用户,这是更好的方法。
【解决方案2】:

Laravel 5.4+ 使用 post 方法进行注销,因此您应该发布一个表单来注销,而不是简单的 url (get) 请求。

在您的 main.blade.php 文件中替换以下行:

{{ Auth::check() ? "Logged In" : "Logged Out"}}

使用以下示例,请根据您的需要进行更改 - 这只是放置这些代码的示例。

 @if (Auth::guest())
                    <a href="{{ route('login') }}">Login</a>
                @else

                                <a href="{{ route('logout') }}"
                                    onclick="event.preventDefault();
                                             document.getElementById('logout-form').submit();">
                                    Logout
                                </a>

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

                @endif

【讨论】:

  • 这是否意味着我应该创建另一个名为 logout.blade.php 的刀片文件,因为我只能在资源/视图/身份验证中看到登录和注册刀片文件
  • 不,您应该在注销按钮时使用它。您的注销按钮在哪里!请分享您的html代码
  • 哦,我想我已经知道在哪里发布代码了,按钮终于开始工作了。我错误地发布了我的查询......非常感谢哈桑......竖起大拇指!
【解决方案3】:

您可以做的是创建一个名为/logout 的新路由,然后将其绑定到Auth 控制器中的logout 方法,而不是使用我认为会使代码混乱的表单。

只需将此行添加到您的routes/web.php

Route::get('/logout', 'Auth\LoginController@logout')-&gt;name('logout' );

注意:我为我的代码降价混乱道歉

【讨论】:

    【解决方案4】:
    Route::get('logout', function(){
    
         return back();
    
    });
    
    Route::post('logout', 'AuthController@logout');
    

    【讨论】:

    • 请描述这是如何回答问题的。请在发布前阅读 SO 指南。
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2014-09-16
    • 2014-07-30
    • 2016-04-23
    • 2018-08-01
    • 2016-02-13
    • 2018-03-01
    • 2019-05-15
    相关资源
    最近更新 更多