真正高频、常被追问底层逻辑的不到10题;其余多是概念复述或命令拼写,背了容易忘,用错反而暴露基础不牢。

直接说结论:这30题里,真正高频、常被追问底层逻辑的不到10题;其余多是概念复述或命令拼写,背了容易忘,用错反而暴露基础不牢。
route::get() 和 Route::resource() 的区别不只是写法
很多人以为 Route::resource() 就是 Route::get() + Route::post() 等的快捷写法,其实它还隐含两层约束:
- 默认绑定控制器方法名(如
index、store),一旦改名就得用->names()或->only()显式控制 - 自动注册中间件时,会把中间件应用到全部动作上——包括
destroy这种敏感操作,而手动写的Route::delete()更容易做细粒度控制 - 路由参数命名固定为
{model}(如/posts/{post}),若模型名和路由段不一致(比如用article而非post),必须配合->parameters()重映射,否则Route::model()绑定会失败
DB::transaction() 不等于 try-catch 套一层
常见错误是这么写:
try {
DB::transaction(function () {
// ...
});
} catch (\Exception $e) {
// ...
}
问题在于:如果事务内抛异常但没被 DB::transaction() 捕获(比如用了 throw new \RuntimeException),事务不会自动回滚。正确做法是:
- 确保所有异常都继承
\Exception(Laravel 默认只对它回滚) - 避免在事务闭包里调用
exit、die或未捕获的 fatal error - 想手动控制回滚,用
DB::rollBack(),但必须配DB::beginTransaction(),且不能混用闭包式和手动式
$fillable 和 $guarded 都防不了批量赋值漏洞
这两个属性只是 Eloquent 层的“开关”,不是安全边界。真实风险点在:
- 前端传参没过滤(比如 JSON 里塞了个
"is_admin": true),后端又用了Model::create($request->all())—— 此时$fillable才起作用 - 但如果用
$model->fill($data)->save(),且$data来自未经校验的输入,$guarded同样失效 - 更隐蔽的是:当模型启用了
casts,比如'status' => 'boolean',攻击者传"status": "true"或"1"都可能绕过布尔校验逻辑
Artisan 命令里最容易写错的三个参数
不是记不住命令,而是参数顺序和符号常出错:
-
php artisan make:controller UserController --resource --api:两个 flag 顺序无关,但--api必须显式加,否则生成的控制器带create和edit方法(HTML 路由专用) -
php artisan migrate:fresh --seed:--seed是独立 flag,不是--seeder=xxx;而且它只运行DatabaseSeeder,不会自动找你自定义的 seeder 类 -
php artisan config:cache:这个命令会把.env编译进缓存,但如果你在本地开发时改了.env又忘了config:clear,就会一直读旧配置——尤其影响APP_DEBUG和数据库连接
真正卡人的从来不是“会不会写 Route::get()”,而是当 Route::model('user', User::class) 绑定失败时,你第一反应是查路由还是查模型的 getRouteKeyName()?这种细节,才是面试官看底子的地方。


















