Laravel资源路由下Category Controller遇404及方法不存在异常
解决Laravel资源路由引发的BadMethodCallException问题
问题场景
我为Category Controller配置了资源路由:
Route::resource('api/category', CategoryController::class);
对应的CategoryController代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Category; class CategoryController extends Controller { public function pruebas() { return "controlador de categoria"; } public function index() { $categories = Category::all(); return response()->json([ 'code' => 200, 'status' =>'success', 'categories' => $categories ]); } }
执行php artisan route:list可见路由:
GET|HEAD api/category ..... category.index › CategoryController@index
但使用Postman测试时返回404,同时抛出异常:
BadMethodCallException: Method App\Http\Controllers\CategoryController::show does not exist. in file /var/www/html/api-rest-laravel/vendor/laravel/framework/src/Illuminate/Routing/Controller.php on line 68
问题原因
- Laravel的
Route::resource默认会生成7个RESTful路由,除了index,还包含create、store、show、edit、update、destroy。你看到的route:list仅显示了index,但实际所有7个路由规则已被注册。 - 若你访问了类似
GET api/category/1的带参数URL,Laravel会尝试调用控制器未实现的show方法,从而抛出异常;而404则是因为你测试的URL与index路由(无参数的GET api/category)不匹配。
解决方案
方案1:仅注册需要的资源路由
如果只需要index对应的路由,可在定义资源路由时指定仅生成该方法的路由:
// 仅保留index方法的路由 Route::resource('api/category', CategoryController::class)->only(['index']);
或排除不需要的路由:
// 排除所有不需要的资源路由 Route::resource('api/category', CategoryController::class)->except(['create', 'store', 'show', 'edit', 'update', 'destroy']);
修改后执行php artisan route:clear清除路由缓存,再测试GET api/category即可正常访问。
方案2:补全缺失的控制器方法
若需要完整的资源路由功能,在CategoryController中添加缺失的show方法(及其他需要的方法):
public function show(Category $category) { return response()->json([ 'code' => 200, 'status' => 'success', 'category' => $category ]); }
确保测试URL对应正确路由:
- 获取所有分类:
GET api/category(对应index方法) - 获取单个分类:
GET api/category/1(对应show方法)
内容的提问来源于stack exchange,提问作者Rafael Hernández
相关产品推荐
相关产品推荐

