我正在编写一个webservice 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'] ]
);
}
);
所以,当我尝试任何GET / POST / PUT / PATCH / DELETE方法时
project.dev/v2/foo
或project.dev/v2/foo/1234
网址,一切正常。
但是,出于某种原因,只有GET和POST适用于project.dev/v2/foo/1234/bar
。其他方法只抛出405(MethodNotAllowedHttpException)
(是的,我通过 Advanced Rest Client Chrome扩展程序发出请求。)
发生了什么事? 我错过了什么?
答案 0 :(得分:18)
解决!
可以通过运行php artisan routes
找到答案。
这表明DELETE和PUT / PATCH期望(需要)一个条形码
我碰巧忽略了这一点,因为只有一种特殊类型的" bar"。只需将其简单地添加到我的网址即可轻松解决,例如project.dev/v2/foo/1234/bar/5678
。
答案 1 :(得分:6)
对于使用Laravel版本的用户> 4.2使用此:
php artisan route:list
这将给出应用程序中设置的路径列表。检查路由中是否允许PUT和DELETE的路由。 405错误主要是因为这些方法没有路由。
答案 2 :(得分:0)
我不了解旧的Laravel版本。但是我从5.2开始使用Laravel,在使用put,patch或delete时需要包含一个隐藏的方法输入。
例如:
<input type="hidden" name="_method" value="PUT">
答案 3 :(得分:0)
只需在表单中添加一个隐藏的输入字段
<input type="hidden" name="_method" value="PUT">
并将表单方法保留为发布
<form method="post" action="{{action('')}}">
答案 4 :(得分:0)
如果您想在提交表单中使用方法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
});