控制器中只有一些Laravel路由工作

时间:2017-08-29 14:18:35

标签: php laravel rest routing routes

我在前端使用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本地运行。

1 个答案:

答案 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