Route::resource() 仅生成路由和方法骨架,需手动补全逻辑、验证、权限等;控制器需在路由文件中注册,隐式绑定仅对show/edit/update/destroy生效且参数名须严格匹配。

Route::resource() 不是“写完就能跑”的快捷键,它只负责按约定生成路由和方法骨架,逻辑、验证、返回、权限全得你手动补全。
为什么 php artisan make:controller --resource 后访问 /posts 是 404?
因为命令只生成控制器文件,不碰任何路由文件——这是设计,不是遗漏。
- 必须手动在
routes/web.php或routes/api.php中添加:use App\Http\Controllers\PostController;+Route::resource('posts', PostController::class); - 漏掉
use语句会导致Class 'PostController' not found,尤其在 Laravel 9+ 后默认禁用字符串式路由写法(如'PostController@index') - 运行
php artisan route:list能立刻确认路由是否注册成功,别靠猜
store() 和 update() 里不加 $request->validate() 会怎样?
直接暴露数据校验漏洞:空标题、超长内容、非法邮箱都可能入库,且前端收不到结构化错误字段。
- 别在方法里手写
if (! $request->title)这类判断——既重复又难维护 - 用
php artisan make:request StorePostRequest,在rules()里写规则,再把参数类型提示改成StorePostRequest $request -
update()必须另建UpdatePostRequest,别试图在同一个请求类里用$this->route('post')分支判断——IDE 无法推导、测试难覆盖、规则耦合 - 验证失败自动返回 422 响应,别自己
try/catch吞掉异常,否则前端拿不到errors字段
隐式模型绑定在资源路由里哪几个方法生效?
只对 show()、edit()、update()、destroy() 四个带 URL 参数的方法起作用,且有硬性限制。
- 参数名必须和路由段完全一致:比如
/posts/{post}→ 方法签名必须是public function show(Post $post),写成show($id)或show(Post $p)都会失效,$post是null -
store()没有路由参数,无法触发隐式绑定,只能从表单取值:$request->input('user_id')或显式查询User::find($request->user_id) - 如果改了参数别名(如
Route::resource('posts', PostController::class)->parameters(['posts' => 'slug'])),绑定也失效,$post变成字符串而非模型实例
什么时候该用 only() 或 except()?
不是为了“删代码图省事”,而是为了明确接口边界,避免误用或权限泄露。
- API 接口通常不需要
create和edit(它们返回 HTML 表单),用->only(['index', 'show', 'store', 'update', 'destroy']) - 后台管理可能需要全部 7 个,但
store和update要校验权限,这时别删路由,而在方法里加abort_if(! auth()->user()->can('manage-posts'), 403) - 禁用
destroy别直接except,否则前端 JS 发起 DELETE 请求会得到 404,不好定位问题;改成在destroy()方法里抛abort(403)或重定向,保持 HTTP 状态码语义清晰
--resource,index 里没写 Post::with('author')->get(),show 里没加 ->where('published', true),它照样跑,只是返回空或错的数据。


















