【问题标题】:Laravel Exception 405 MethodNotAllowedLaravel 异常 405 MethodNotAllowed
【发布时间】:2019-05-09 12:04:46
【问题描述】:

我正在尝试在我的程序中创建一个新的“Airborne”测试并获得 405 MethodNotAllowed 异常。

路线

Route::post('/testing/{id}/airbornes/create', [
    'uses' => 'AirborneController@create'
]);

控制器

public function create(Request $request, $id)
{
    $airborne = new Airborne;

    $newairborne = $airborne->newAirborne($request, $id);

    return redirect('/testing/' . $id . '/airbornes/' . $newairborne)->with(['id' => $id, 'airborneid' => $newairborne]);
}

查看

<form class="sisform" role="form" method="POST" href="{{ URL::to('AirborneController@create', $id) }}">
    {{ csrf_field() }}
    {!! Form::token(); !!}
    <button type="submit" name="submit" value="submit" class="btn btn-success">
        <i class="fas fa-plus fa-sm"></i> Create
    </button>
</form>

【问题讨论】:

  • 哪条路线抛出 405?帖子还是重定向?
  • 删除{!! Form::token(); !!}

标签: php laravel routes laravel-routing laravel-exceptions


【解决方案1】:

MethodNotAllowedHttpException 指示您的路由不适用于指定的 HTTP 请求方法。也许是因为它没有正确定义,或者它与另一个类似命名的路由发生冲突。

命名路线

考虑使用命名路由来方便地生成 URL 或重定向。它们通常更容易维护。

Route::post('/airborne/create/testing/{id}', [
    'as' => 'airborne.create',
    'uses' => 'AirborneController@create'
]);

Laravel 集体

使用 Laravel Collective 的 Form:open 标签并移除 Form::token()

{!! Form::open(['route' => ['airborne.create', $id], 'method' =>'post']) !!}

<button type="submit" name="submit" value="submit" class="btn btn-success">
    <i class="fas fa-plus fa-sm"></i> Create
</button>

{!! Form::close() !!}

dd() 辅助函数

dd 函数转储给定变量并结束脚本的执行。仔细检查您的 Airborne 课程是否返回您期望的对象或 id。

dd($newairborne)

列出可用路线

始终确保您定义的路线、视图和操作匹配。

php artisan route:list --sort name

【讨论】:

    【解决方案2】:

    据我所知,表单没有 href 属性。我想你应该写 Action 但写的是 href。 请在您尝试提交的表单中指定 action 属性。

    <form method="<POST or GET>" action="<to which URL you want to submit the form>">
    

    在你的情况下它

    <form method="POST" ></form>
    

    并且缺少动作属性。如果 action 属性缺失或设置为 ""(空字符串),则表单将提交给自身(相同的 URL)。

    例如,您已经定义了将表单显示为的路由

    Route::get('/airbornes/show', [
        'uses' => 'AirborneController@show'
        'as' => 'airborne.show'
    ]);
    

    然后你提交一个没有 action 属性的表单。它将表单提交到它当前所在的同一路由,它会寻找具有相同路由的 post 方法,但您没有与 POST 方法相同的路由。所以你得到 MethodNotAllowed 异常。

    要么使用 post 方法定义相同的路由,要么显式指定 HTML 表单标签的 action 属性。

    假设您有一个定义如下的路由来提交表单

    Route::post('/airbornes/create', [
            'uses' => 'AirborneController@create'
            'as' => 'airborne.create'
        ]);
    

    所以你的表单标签应该像

    <form method="POST" action="{{ route('airborne.create') }}">
    //your HTML here
    </form>
    

    【讨论】:

      【解决方案3】:

      首先
      表单没有 href 属性,它有“action

      <form class="sisform" role="form" method="POST" action="{{ URL::to('AirborneController@create', $id) }}">
      

      其次
      如果上述更改不起作用,您可以进行一些更改,例如:

      1.路线
      将您的路线命名为:

      Route::post('/testing/{id}/airbornes/create', [
          'uses' => 'AirborneController@create',
          'as'   => 'airborne.create',         // <---------------
      ]);
      

      2。查看
      在表单操作中使用route() 方法而不是URL::to() 方法提供路由名称:

      <form class="sisform" role="form" method="POST" action="{{ route('airborne.create', $id) }}">
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 2014-07-16
        • 2011-01-13
        • 2014-05-29
        相关资源
        最近更新 更多