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/foo
或 project.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 > 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