laravel 的 make:controller 不自动注册路由,因设计上仅创建控制器文件,不修改 routes/web.php 或 api.php;资源控制器需手动添加 route::resource(),单动作控制器用 --invokable 生成 __invoke 方法。

php artisan make:controller 生成的类为什么没自动注册路由?
因为 Laravel 默认不自动绑定控制器和路由,make:controller 只负责建文件,不碰 routes/web.php 或 routes/api.php。这是设计使然,不是 bug。
- 新控制器默认继承
Controller(在app/Http/Controllers/Controller.php),但没加Route::controller()这种旧式注册方式,Laravel 9+ 已不推荐 - 如果你用的是资源控制器(加
--resource参数),它只生成方法骨架,仍需手动写Route::resource() - 常见错误:运行完
php artisan make:controller PostController --resource就直接访问/posts,结果 404——因为路由根本没声明
什么时候该用 php artisan make:controller --invokable?
当你只需要一个单动作(single-action)控制器,比如处理 Webhook 回调、健康检查接口或跳转页,--invokable 最合适。它生成的类只有一个 __invoke() 方法,语义清晰,也更轻量。
- 适合场景:
/health、/webhook/stripe、/redirect/legacy - 生成后路由写法是
Route::get('/health', [HealthCheckController::class]);—— 注意,方括号里没方法名,Laravel 自动调__invoke - 别滥用:如果后续要加第二个逻辑(比如同时支持 GET 和 POST),就得重构成普通控制器,不如一开始选对类型
控制器里 $request->validate() 报错 “Class 'Illuminate\Http\Request' not found” 怎么办?
这是 PHP 命名空间漏了 use 语句,不是 Laravel 配置问题。Laravel 控制器默认不自动引入 Request 类,必须显式声明。
- 在控制器顶部补上:
use Illuminate\Http\Request; - 如果用了类型提示但没 use,PHP 解析时会去当前命名空间找
App\Http\Controllers\Request,自然报错 - 验证失败默认抛
ValidationException,会自动返回 422 响应——这个行为依赖 Laravel 的异常渲染机制,别自己 try/catch 吞掉,否则前端收不到错误字段
为什么在控制器里用 DB::table() 比 Eloquent 更快,但不推荐随便换?
绕过 Eloquent 模型层确实少了属性访问器、事件、强制类型转换等开销,DB::table() 是纯查询构建器,执行更快。但代价是失去模型带来的安全边界和可维护性。
- 适合场景:后台导出报表、定时任务中查聚合数据、迁移脚本里批量更新
- 风险点:手写
whereRaw()容易 SQL 注入;没模型作用域(scopes)和访问器(accessors),日期/JSON 字段得自己 cast - 性能差异在小数据量下几乎不可测,别为“看起来快”放弃抽象——真正卡住的通常是 N+1,不是 ORM 本身
Route::fallback()——这些细节不显眼,但线上出问题时,八成栽在这几处。











