我在前端使用Laravel作为RestAPI和React。 GET路由可以工作,但是在同一个控制器中,PUT和DELETE路由不会。
以下是api.php
中指定的路线。此文件中的其他(未列出)路由也可以使用。
// works
Route::get('unapproved', [
'uses' => 'AdminController@indexEvents',
'middleware' =>'auth.jwt'
]);
// doesn't work (404 error)
Route::put('unapproved/${id}', [
'uses' => 'AdminController@approveEvent',
'middleware' =>'auth.jwt'
]);
// doesn't work (404 error)
Route::delete('unapproved/${id}', [
'uses' => 'AdminController@deleteEvent',
'middleware' =>'auth.jwt'
]);
这是AdminController.php
。还有一些其他工作控制器我没有列出。
class AdminController extends Controller
{
// works
public function indexEvents() // works
{
return Event::where('approved', 0)->get();
}
// not recognized by api.php
public function approveEvent(Request $request, $id)
{
echo $request; // for testing purposes
}
// not recognized by api.php
public function deleteEvent()
{
$event = Event::find($id);
$event->delete();
return response()->json(null, 204);
}
}
API请求来自其他请求有效的auth.js
:
// works
getEvents: (token) => {
const url = `api/unapproved?token=${token}`
return new Promise((resolve, reject) => axios.get(url)
.then(res => resolve(res.data))
.catch(err => reject(err)) )
},
// doesn't work
approveEvent: (token, event, id) => {
const url = `api/unapproved/${id}?token=${token}`
return new Promise((resolve, reject) => axios.put(url, event)
.then(res => resolve(res.data))
.catch(err => reject(err)) )
},
// doesn't work
deleteEvent: (token, id) => {
const url = `api/unapproved/${id}?token=${token}`
return new Promise((resolve, reject) => axios.delete(url)
.then(res => resolve(res.data))
.catch(err => reject(err)) )
},
AuthController.php
必须可以从api.php
访问,因为GET路由有效,但我列出的两条PUT和DELETE路由都不起作用。工作路由使用相同的中间件,我得到404错误,而不是身份验证错误。
我已经在api.js
中记录了每条路线的URL,并且它们符合预期。此外,路线及其相应的功能是基于工作的其他部分 - 唯一的区别是变量。
为什么它会识别某些使用控制器内部功能的路由,而不是其他指向同一控制器内不同功能的路由?
系统信息:Laravel 5.4,Php 5.6,在Linux Mint上与Apache本地运行。
答案 0 :(得分:1)
您在Laravel中的路线不正确,您需要在绑定之前移除$
:
// doesn't work (404 error)
Route::put('unapproved/{id}', [
'uses' => 'AdminController@approveEvent',
'middleware' =>'auth.jwt'
]);
// doesn't work (404 error)
Route::delete('unapproved/{id}', [
'uses' => 'AdminController@deleteEvent',
'middleware' =>'auth.jwt'
]);
您还需要将id
传递给deleteEvent
方法。
我还会查看implicit bindings,它可以自动解析您的Events
。