Laravel 5.5 的 Route::resource() 是开箱即用的 RESTful 路由核心机制,但必须严格匹配控制器方法签名、命名约定和 HTTP 方法语义;访问 /cars 返回 404 是因误用匿名函数路由而非显式声明 Route::resource('cars', 'CarController'),且需确保复数路径名、PSR-4 合规路径、Artisan 生成控制器、隐式绑定手动启用、按需使用 only/except 控制动作,并区分 web.php 与 api.php 的中间件及前缀。

直接说结论:Laravel 5.5 的 Route::resource() 是开箱即用的 RESTful 路由核心机制,但必须严格匹配控制器方法签名、命名约定和 HTTP 方法语义,否则 404 或 500 就是常态。
为什么访问 /cars 返回 404?
你贴出的代码里用了匿名函数路由:Route::get('/cars', function () { ... }),这和资源路由完全无关——它只是个普通 GET 路由,不会自动绑定到控制器任何动作,更不会触发 index 方法。真正的资源路由必须显式声明:
-
Route::resource('cars', 'CarController');才会注册GET /cars→CarController@index - 路径名(
'cars')必须是复数形式,Laravel 默认按此生成 URI 和路由名 - 控制器类名必须准确,且文件路径要符合 PSR-4(如
app/Http/Controllers/CarController.php) - 如果控制器不在默认命名空间,需用完整类名或提前
use
如何快速生成合规的资源控制器?
别手写控制器骨架,用 Artisan 命令保证方法名、参数、返回值全部对齐:
- 运行
php artisan make:controller CarController --resource - 生成的控制器已包含全部 7 个标准方法:
index、create、store、show、edit、update、destroy -
show和edit等方法接收的是模型 ID($id),不是模型实例;若想自动注入模型,得配合隐式/显式路由模型绑定(见下一条) - 注意:Laravel 5.5 默认不启用隐式绑定,需在
AppServiceProvider@boot中调用Route::model('car', Car::class);才能用show(Car $car)
资源路由参数控制与常见陷阱
不是所有场景都需要全部 7 个路由。比如纯 API 不需要 create 和 edit(它们返回 HTML 表单页),这时必须显式排除:
- 只保留读写接口:
Route::resource('cars', 'CarController')->only(['index', 'show', 'store', 'update', 'destroy']); - 禁用特定动作:
->except(['create', 'edit']) - 错误示范:
Route::get('/cars', 'CarController@index')+Route::resource('cars', 'CarController')会导致重复注册,可能覆盖或冲突 - API 路由应放在
routes/api.php,它自带api中间件前缀(如/api/cars),而web.php用于带 session 的页面请求 - 如果你在
api.php里写Route::resource('cars', 'CarController'),实际访问路径是GET /api/cars,不是/cars
最易被忽略的是中间件作用域:API 资源路由默认无认证,auth:api 必须手动附加;而 Web 资源路由若依赖 session,web 中间件组已默认包裹,无需重复加。











