Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException

Posted

技术标签:

【中文标题】Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException【英文标题】:Laravel: Route::resource() GET & POST work, but PUT & DELETE throw MethodNotAllowedHttpException 【发布时间】:2015-01-17 16:33:55 【问题描述】:

我正在编写一个 Web 服务 API(在 laravel 4.2 中)。 出于某种原因,基于 HTTP 方法,到我的一个控制器的路由选择性地失败了。

我的 routes.php 看起来像:

Route::group(array('prefix' => 'v2'), 
    function()
    
        Route::resource('foo', 'FooController',
            [ 'except' => ['edit', 'create'] ]
            );
        Route::resource('foo.bar', 'FooBarController',
            [ 'except' => ['show', 'edit', 'create'] ]
            );
    
);

因此,当我为 project.dev/v2/fooproject.dev/v2/foo/1234 网址尝试任何 GET / POST / PUT / PATCH / DELETE 方法时,一切正常。

但是,出于某种原因,只有 GET 和 POST 对 project.dev/v2/foo/1234/bar 有效。其他方法只是抛出 405 (MethodNotAllowedHttpException)。 (仅供参考,我通过 Advanced Rest Client Chrome 扩展程序发出请求。)

发生了什么事? 我错过了什么?

【问题讨论】:

也许你的 API 只支持currentproject.dev/v2/companies/legalname/1234/ 【参考方案1】:

如果您想在提交表单中使用 PUT 方法,请查看此链接 https://laravel.com/docs/5.6/routing#form-method-spoofing

但是如果你在你的项目中使用 ajax,你可以做这样的事情:

<form>
@method('PUT')
// your_element

在你的脚本上添加:

$.ajaxSetup(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);

$.ajax(
  url:  route('your_route', ':id') ,
  type: 'POST',
  data: data,
  dataType: 'json',
  cache: false,
).done(function(data,status)
    // anything
).fail(function()
   // anything

);

【讨论】:

【参考方案2】:

只需在表单中添加一个隐藏的输入字段

    <input type="hidden" name="_method" value="PUT">

并将表单方法保留为帖子

    <form method="post" action="action('')">

【讨论】:

【参考方案3】:

我不知道旧的 Laravel 版本。但是我从 5.2 开始使用 Laravel,在使用 put、patch 或 delete 时需要包含隐藏的方法输入。

例如:

<input type="hidden" name="_method" value="PUT"> 

查看https://laravel.com/docs/5.6/routing#form-method-spoofing

【讨论】:

救命!这对我有用。非常感谢【参考方案4】:

对于使用 Laravel 版本 > 4.2 的用户,请使用:

php artisan route:list

这将给出您的应用程序中设置的路由列表。检查您的路线中是否允许 PUT 和 DELETE 路线。 405错误主要是因为这些方法没有路由。

【讨论】:

4.2 &gt; 4 以来略有误导 ;)【参考方案5】:

解决了! 运行php artisan routes可以找到答案。

这表明 DELETE 和 PUT/PATCH 需要(需要)条形 ID。 我碰巧忽略了这一点,因为这种特殊类型的“酒吧”只能有一种。轻松修复它只需将其添加到我的 URL 中,例如 project.dev/v2/foo/1234/bar/5678

【讨论】:

以上是关于Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 - Route::resource 与 Route::controller。使用哪个?

LARAVEL - 使用 Route::resource 生成路由时无法使用销毁路由

Laravel 使用 Route::resource 生成路由需要添加前缀 /admin/

Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException

Laravel 本地化与 Route Resource 参数混淆

Laravel 内置 Route::resource 可以直接创建 restful 风格的接口