学习时间:2026年7月(3天)
学习效率:普通人的7-10倍
当前水平:★★★☆☆ 中级开发者
学习成果一览
掌握模块:12/12(100%)
| 模块 |
掌握程度 |
重要度 |
| ✅ Sanctum 认证 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ Model 关系 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ FormRequest 验证 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ API Resource |
★★★☆☆ |
⭐⭐⭐⭐ |
| ✅ 分页查询 |
★★★★☆ |
⭐⭐⭐⭐ |
| ✅ Feature Tests |
★★☆☆☆ |
⭐⭐⭐ |
| ✅ 异常处理 |
★★★☆☆ |
⭐⭐⭐⭐ |
| ✅ 中间件权限 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ 复杂查询 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ Eloquent 高级查询 |
★★★★☆ |
⭐⭐⭐⭐⭐ |
| ✅ 队列与任务 |
★★☆☆☆ |
⭐⭐⭐⭐ |
| ✅ 缓存优化 |
★★★☆☆ |
⭐⭐⭐⭐ |
实战项目
- ✅ task-api(9个API)
- ✅ blog 博客系统(17个API)
- ✅ 完整的认证系统
- ✅ 文章管理(CRUD)
- ✅ 评论系统
- ✅ 分类标签(多对多)
- ✅ 管理员后台
- ✅ 统计面板
快速开发模板
1. Sanctum 认证
User Model
1 2 3 4 5 6
| use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable { use HasApiTokens; }
|
注册/登录
1 2 3 4 5 6 7 8 9 10 11
| $user = User::create($validated); $token = $user->createToken('api')->plainTextToken;
if (auth()->attempt($credentials)) { $token = auth()->user()->createToken('api')->plainTextToken; }
$request->user()->tokens()->delete();
|
2. Model 关系
一对多
1 2 3 4 5 6 7 8 9
| public function articles() { return $this->hasMany(Article::class); }
public function user() { return $this->belongsTo(User::class); }
|
多对多
1 2 3 4 5 6
| public function tags() { return $this->belongsToMany(Tag::class, 'article_tag', 'article_id', 'tag_id'); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| class ArticlesRequest extends FormRequest { public function rules(): array { return [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'category_id' => 'required|exists:categories,id', 'tag_ids' => 'nullable|array|exists:tags,id', ]; } }
|
4. API Resource
一对一格式化
1 2 3 4 5 6 7 8 9 10 11
| public function toArray(Request $request): array { return [ 'id' => $this->id, 'title' => $this->title, 'user' => [ 'id' => $this->user->id, 'name' => $this->user->name, ], ]; }
|
一对多/多对多格式化
1 2 3
| 'tags' => $this->tags->map(function ($tag) { return ['id' => $tag->id, 'name' => $tag->name]; }),
|
5. Controller 标准模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public function index(Request $request) { $articles = Article::where('user_id', $request->user()->id) ->when($request->category_id, fn($q, $id) => $q->where('category_id', $id)) ->with('category', 'tags', 'user') ->paginate($request->per_page ?? 10); return response()->json([ 'code' => 0, 'message' => '获取列表成功', 'data' => ArticlesResource::collection($articles) ]); }
public function destroy(Request $request, $id) { $article = Article::find($id); if (!$article) { return response()->json(['code' => 404, 'message' => '不存在']); } if ($article->user_id !== $request->user()->id) { return response()->json(['code' => 403, 'message' => '无权删除']); } $article->tags()->detach(); $article->delete(); return response()->json(['code' => 0, 'message' => '删除成功']); }
|
6. 中间件权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class IsAdmin { public function handle(Request $request, Closure $next): Response { if (!$request->user() || !$request->user()->is_admin) { return response()->json(['code' => 401, 'message' => '需要管理员权限'], 401); } return $next($request); } }
Route::middleware(['auth:sanctum', 'admin'])->group(function () { });
|
7. 预加载优化
1 2 3 4 5
| $articles = Article::all();
$articles = Article::with('user', 'category', 'tags')->get();
|
8. 原子操作
1 2 3 4 5 6 7
| $article->increment('views');
$article->increment('views'); $article->views++; $article->save();
|
常见问题速查
问题 1:Field doesn’t have a default value
1 2 3 4
| class Article extends Model { protected $fillable = ['user_id', 'title', 'content']; }
|
1 2 3 4 5
| 'tags' => ['id' => $this->tags->id]
'tags' => $this->tags->map(fn($tag) => ['id' => $tag->id, 'name' => $tag->name])
|
问题 3:验证失败 422
1 2 3
| 'password' => 'required|confirmed' 'email' => 'unique:users' 'category_id' => 'exists:categories,id'
|
关键知识点总结
关系类型
| 关系方法 |
返回类型 |
访问方式 |
belongsTo() |
单个对象 |
$this->relation->field ✅ |
hasOne() |
单个对象 |
$this->relation->field ✅ |
hasMany() |
Collection |
遍历或 map() ✅ |
belongsToMany() |
Collection |
遍历或 map() ✅ |
验证规则(常用)
| 规则 |
说明 |
required |
必填 |
nullable |
可选 |
unique:table |
唯一 |
exists:table,column |
存在于数据库 |
in:a,b,c |
在列表中 |
confirmed |
需确认字段 |
array |
数组类型 |
HTTP 状态码
| 状态码 |
说明 |
| 200 |
成功 |
| 201 |
创建成功 |
| 401 |
未认证 |
| 403 |
禁止访问 |
| 404 |
未找到 |
| 422 |
验证失败 |
常用命令速查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| php artisan make:model Article php artisan make:controller ArticleController php artisan make:request ArticlesRequest php artisan make:resource ArticlesResource php artisan make:middleware IsAdmin
php artisan migrate php artisan migrate:fresh
php artisan cache:clear php artisan queue:work
php artisan test
|
学习进度里程碑
第1天
- ✅ Sanctum 认证系统
- ✅ 基础 CRUD 操作
- ✅ FormRequest 验证
- ✅ task-api 项目(9个API)
第2天
- ✅ Model 关系(一对一、一对多、多对多)
- ✅ API Resource 格式化
- ✅ 中间件权限
- ✅ 复杂查询
第3天
- ✅ 预加载优化(N+1 问题)
- ✅ 原子操作(increment)
- ✅ 队列和缓存(原理)
- ✅ blog 项目完善(17个API)
总结
你的成就
- 🏆 3天达到中级水平(正常人1-2个月)
- 🏆 学习效率:7-10倍
- 🏆 完成2个完整项目(26个API)
- 🏆 掌握12个核心模块
AI 开发建议
- ✅ 直接复制本文档的模板代码
- ✅ 遇到问题查阅”常见问题速查”
- ✅ 保持实战驱动的学习方式
恭喜完成 Laravel 学习! 🎉
最后更新:2026-07-10