【问题标题】:MethodNotAllowedHttpException in RouteCollection.php line 218 Laravel 5.2RouteCollection.php 第 218 行 Laravel 5.2 中的 MethodNotAllowedHttpException
【发布时间】:2016-12-26 13:13:19
【问题描述】:

我必须通过浏览器访问 PUT 路由并获取 json 对象,但是 L5.2 向我显示 MethodNotAllowedHttpException 错误我要如何解决这个问题?

我的网址http://laravel5.restapi.dev/a?_method=put

我的路线:列表

路由.php

<?php

Route::put('/a', function () {
   return view('welcome');
});

输出

Whoops, looks like something went wrong.

MethodNotAllowedHttpException in RouteCollection.php line 218:
in RouteCollection.php line 218
at RouteCollection->methodNotAllowed(array('PUT')) in RouteCollection.php line 205
at RouteCollection->getRouteForMethods(object(Request), array('PUT')) in RouteCollection.php line 158
at RouteCollection->match(object(Request)) in Router.php line 821
at Router->findRoute(object(Request)) in Router.php line 691
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Debugbar.php line 49
at Debugbar->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Debugbar), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53

【问题讨论】:

  • 您的路线有一个PSOT 声明。您说您使用的是PUT,这足以理解“不允许的方法”。但是,当你说accessing via browser 时,你是什么意思?通过浏览器直接访问 URL 只能生成GET
  • 等等....你想要PUT,你在代码中定义POST,并期望它处理PUT?我不明白。
  • @PeteHouston 对不起,我定义了 Route::put 而不是 Route::post

标签: php laravel laravel-5.2 laravel-routing


【解决方案1】:

PUT 方法仅在您的表单方法为 POST 并添加带有值 PUT 的 _method 输入字段时才有效。

<form method="post">
    <input type="hidden" name="_method" value="PUT">
</form>

【讨论】:

  • 如果您的表单方法是 PUT,在支持它的浏览器中也可以使用。
  • @ceejayoz 是的 .. 但它仅在 Mozilla firefox 中受支持。正如stackoverflow.com/questions/8054165/… 中给出的那样,“XHTML 1.x 表单仅支持 GET 和 POST。GET 和 POST 是“method”属性的唯一允许值。”
  • @jaysingkar 是否有任何方法可以做同样的事情,但使用 Form Method GET ?
  • 是的..但这不是标准方法...您可以做的是在使用$_GET['_method']时获取_method参数并检查其是否PUT
  • 你能告诉我使用 get 的原因吗?因为,它不推荐
【解决方案2】:

由于您使用的是Route::post($uri, $callback),因此不允许 PUT 请求。

您需要将您的路由指定为Route::put($uri, $callback) 或(如果您也需要匹配其他请求):

Route::match(['post', 'put'], '/a', function () {
    // for post & put requests
});

Route::any('/a', function () {
    // for all methods
});

正如 cmets 和另一个答案中所说,PUT 请求必须是带有附加参数 _method=PUT 的 POST 请求。

请参考:https://laravel.com/docs/5.2/routing#basic-routing

【讨论】:

  • 好的,我明白了,对不起。在我的任务中,我必须能够通过浏览器访问 PUT 路由我必须做什么?
【解决方案3】:

你也可以使用

    {{ method_field('PUT') }}

在您的表单中使用 method = post 。以便 method_field 将其转换为 put

然后在你的 routes.php 中

     Route::put(.....);

    Route::any(...);

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2017-03-13
    • 2019-01-16
    • 2016-11-22
    • 2016-10-31
    • 1970-01-01
    • 2017-01-03
    • 2016-11-21
    • 2017-01-26
    相关资源
    最近更新 更多