大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Laravel 概览与环境搭建
这一课你将能做到
- 说清楚 Laravel 是什么、在一次 HTTP 请求中处于什么位置,并能与 Spring Boot 做对照
- 在本机用 Composer 或 Herd 创建一个可运行的 Laravel 11 项目并启动开发服务器
- 看懂 Laravel 11 的精简目录骨架,知道 Breeze / Jetstream / Livewire / Reverb 各自解决什么问题
为什么要学
如果你已经学过本站的 Spring Boot 路线,就会知道一个现代后端框架要解决的事情其实大同小异:路由、控制器、依赖注入、ORM、配置管理、认证、队列、缓存、测试。Laravel 是 PHP 生态里把这些事情整合得最完整的框架,被称为「PHP 界的 Rails」。它的价值不在于某一个单点功能,而在于约定优于配置带来的统一开发体验——团队里任何人拿到项目,目录结构、命名规则、扩展方式几乎一致。
人话版:Spring Boot 像一套标准化的工业流水线,严谨、显式、靠注解和容器把一切串起来;Laravel 像一条预装好了常用机具的工坊,门面(Facade)、助手函数、artisan 命令让你少写大量胶水代码。两者解决的是同一批问题,学 Laravel 反过来也会加深你对 Spring Boot 设计取舍的理解。
本课只解决一件事:让项目在你电脑上跑起来,并看懂它的轮廓。后续 11 课再逐个深入。
先建立图像
一次请求在两个框架中的旅程对照:
浏览器请求 GET /api/orders
│
▼
┌──────────────────────── Laravel ────────────────────────┐
│ public/index.php → Kernel(中间件栈) │
│ → routes/*.php 路由匹配 │
│ → Controller 方法(容器自动注入 Request) │
│ → Eloquent 操作 MySQL / Cache 操作 Redis │
│ → JsonResponse / Blade 视图 │
└──────────────────────────────────────────────────────────┘
┌──────────────────── Spring Boot ────────────────────────┐
│ 内嵌 Tomcat → DispatcherServlet → Filter/Interceptor 链 │
│ → @RequestMapping 路由匹配 │
│ → @RestController 方法(容器注入 HttpServletRequest)│
│ → MyBatis/JPA 操作 MySQL / RedisTemplate │
│ → @ResponseBody JSON / Thymeleaf 视图 │
└──────────────────────────────────────────────────────────┘
关键对应关系:
| Laravel | Spring Boot | 作用 |
|---|---|---|
public/index.php + Kernel | DispatcherServlet | 请求统一入口 |
| Middleware | Filter / Interceptor | 横切处理(鉴权、CORS) |
| Service Container | IoC Container | 依赖注入容器 |
| Eloquent | JPA / MyBatis | 数据访问 |
| Facade / 助手函数 | @Autowired Bean | 取用框架服务 |
| artisan | spring-boot-maven-plugin | 命令行脚手架 |
.env | application.yml + profile | 环境配置 |
跟着做
步骤 1:准备 PHP 8.2+ 与 Composer
Laravel 11 要求 PHP 8.2 及以上。先确认版本(Windows 推荐用 Laravel Herd 一键安装 PHP + Nginx + Composer):
php -v
# PHP 8.3.x ...
composer -V
# Composer version 2.7.x
Herd 安装完成后会自动配好 php 和 composer 命令,并提供一个 *.test 的本地站点管理面板。Linux/macOS 用户可用包管理器安装 PHP 后再装 Composer:
# Ubuntu/Debian 示例:安装 Laravel 11 常用扩展
sudo apt install php8.3-cli php8.3-mbstring php8.3-xml php8.3-curl \
php8.3-sqlite3 php8.3-mysql php8.3-redis php8.3-zip unzip
步骤 2:创建项目
Laravel 11 的安装器会交互式询问是否要默认搭载登录脚手架:
# 方式一:Composer 直接创建(最通用)
composer create-project laravel/laravel:^11.0 shop-api
cd shop-api
# 方式二:全局安装 Laravel 安装器
composer global require laravel/installer
laravel new shop-api
学习阶段数据库可以直接用 SQLite(Laravel 11 默认就是 SQLite,零配置):
# Laravel 11 已经在 database/ 下准备好 database.sqlite
php artisan migrate
这条命令会创建用户表、任务队列表、缓存表等基础表,说明 PHP 与数据库驱动都工作正常。
步骤 3:启动开发服务器
php artisan serve
# INFO Server running on [http://127.0.0.1:8000]
浏览器访问 http://127.0.0.1:8000,看到 Laravel 的欢迎页即成功。这个内置服务器等价于 Spring Boot 的内嵌 Tomcat,仅用于开发,生产环境用 Nginx + PHP-FPM。
用另一个终端验证一条 API 路由(Laravel 11 默认带 /api/ping 之类的健康检查习惯,也可自己加):
curl -i http://127.0.0.1:8000/
# HTTP/1.1 200 OK ...
步骤 4:跑通一次「改代码 → 看效果」
打开 routes/web.php,把首页改成返回 JSON:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return response()->json([
'service' => 'shop-api',
'laravel' => app()->version(),
'php' => PHP_VERSION,
'time' => now()->toIso8601String(),
]);
});
再次 curl http://127.0.0.1:8000/,不需要重启服务(PHP 每次请求重新解释脚本),立刻能看到 JSON。这与 Spring Boot 改 Java 代码需要重启(除非用 DevTools 热加载)形成鲜明对比。
步骤 5:认识脚手架选项
如果项目需要登录注册页面,Laravel 11 推荐在创建项目时直接选 Starter Kit:
laravel new my-app
# Would you like to install a starter kit? [No starter kit]:
# → Laravel Breeze(轻量:Blade 或 Inertia + Vue/React)
# → Laravel Jetstream(重量:含团队管理、两步验证)
- Breeze:一套最小可用的认证实现,代码直接发布到你项目里,适合初学者读懂每个环节。
- Jetstream:在 Breeze 之上叠加团队、个人资料、2FA,适合 SaaS 起步。
- Livewire:让纯 Blade 页面拥有响应式交互(不写 JavaScript 也能局部刷新),偏服务端渲染。
- Reverb:Laravel 官方的 WebSocket 服务,对应 Spring 生态你可能用过的 STOMP/Netty 方案,用来做实时消息。
本课程前 11 课都基于「No starter kit」的纯净骨架,避免脚手架代码干扰理解。
讲清楚要点
- Laravel 11 是精简版骨架:与 10 及以前相比,
app/下默认只有Http/Controllers/Controller.php一个文件,Kernel、Exception 处理等都被收拢进bootstrap/app.php。这是刻意为之,不是缺文件。 - 一切环境差异走
.env:.env.example是模板,复制成.env;.env不进 Git。这与 Spring Boot 用application-{profile}.yml的目的完全相同。 - APP_KEY 是加解密根基:创建项目时安装器会自动
php artisan key:generate。Cookie、会话、加密字段都依赖它,生产环境绝不能泄露或随意更换。 - artisan 是第一工具:
php artisan list能看到所有命令。常用:make:model、make:controller、migrate、route:list、queue:work、schedule:work、test。 - 配置缓存只在生产用:
php artisan config:cache会把.env合并进一份缓存提升性能;开发阶段不要开,否则改.env不生效。 - PHP 的请求模型与 JVM 不同:PHP-FPM 每个请求几乎从零启动框架(依赖随 OPcache 字节码缓存常驻,但对象状态不跨请求保留)。因此不要把业务状态存在静态属性里期望跨请求复用——这一点和 Spring 单例 Bean 长期驻留内存是本质区别。
你可能会懵的地方
-
Laravel 和 ThinkPHP、CodeIgniter 比有什么不同?为什么选它? 生态(Composer 包数量)、官方一等公民组件(Eloquent、Queue、Horizon、Echo、Reverb)、长期支持版本(LTS 节奏稳定)和就业市场占比。学框架本质是学它背后的生态,Laravel 在这几项上是 PHP 阵营最强的。
-
Facade 是不是在滥用静态方法?会不会像 Java 静态调用那样难以测试? 不是普通静态方法。Facade 只是服务容器里某个实例的静态代理,例如
Cache::get('x')实际解析的是容器里的cache服务单例。测试时可以用Cache::fake()替换实现,Mock 成本很低。 -
Herd、Valet、Sail、Homestead 我该装哪个? Windows/macOS 本地学习用 Herd 最省心;macOS 老牌用户可能用 Valet;需要与团队统一 Docker 环境用 Laravel Sail(官方提供的 Docker Compose 套件);Homestead(Vagrant 虚拟机)已逐渐被前三者取代。
-
Breeze 和 Jetstream 会不会让我学不到原理? 恰恰相反,Breeze 会把控制器、路由、Blade 视图、表单请求发布到你的代码库里,是可以直接读的「标准答案」。建议先手动实现一遍认证(第 7 课会做),再回头读 Breeze。
-
Laravel 11 要求 PHP 8.2,我的服务器只有 8.1 怎么办? 两条路:升级 PHP(推荐,8.1 已进入安全更新末期),或使用 Laravel 10(支持 PHP 8.1,但本课程语法示例基于 11,目录差异需要自行对照)。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
把 .env 提交进 Git | 数据库密码、APP_KEY 泄露 | 仅提交 .env.example,.env 进 .gitignore |
在代码里用 $_GET['id'] 取参数 | 绕过框架,丢失验证与中间件 | 用 $request->input('id') 或路由参数 |
在 routes/web.php 里写大段业务逻辑 | 无法测试、无法复用 | 逻辑放控制器或 Service 类 |
生产环境开启 APP_DEBUG=true | 报错页泄露堆栈、环境变量 | 生产设为 false,日志看 storage/logs/laravel.log |
Windows 直接改 vendor/ 内文件修 bug | composer install 后全部丢失 | 发 PR / fork 包 / 用容器绑定重写 |
手动新建 index.html 放到 public 里测试 | 路由不会经过框架 | 一律写路由 + 控制器 |
卡点急救
composer create-project卡在下载或报 SSL 错误:国内网络可切换阿里云 Composer 镜像composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/,再重试。- 页面 500 且什么提示都没有:先看
.env里APP_DEBUG=true、APP_KEY是否生成(没有就php artisan key:generate),再看storage/logs/laravel.log;同时确认storage和bootstrap/cache目录可写。 php artisan migrate报数据库连接失败:学习阶段最省事的方案是删掉.env里所有DB_*配置(Laravel 11 默认回落到 SQLite),并确认database/database.sqlite文件存在且pdo_sqlite扩展已启用。
面试常问
-
介绍一下 Laravel 的请求生命周期。 所有请求由
public/index.php进入,加载 Composer 自动加载器,创建应用实例(bootstrap/app.php),请求依次穿过全局中间件和路由组中间件,匹配到路由后由容器调用对应闭包或控制器方法,返回的 Response 再穿过中间件发回浏览器,最后结束请求。能讲出「入口文件 → Kernel/中间件 → 路由分发 → 控制器 → 响应」这一条线就算合格。 -
Facade、容器、契约(Contract)三者什么关系? 契约是接口(如
Illuminate\Contracts\Cache\Repository),容器负责把接口绑定到具体实现,Facade 用一个静态入口从容器解析实现。这正是「面向接口编程 + IoC」的 PHP 写法,与 Spring 中interface CacheRepository+ 容器注入 Bean 是同构的。 -
PHP 每次请求都重新启动框架,性能为什么还能接受? OPcache 把 PHP 脚本编译后的字节码缓存在共享内存中,避免重复编译;Laravel 启动阶段的大量对象创建确实有成本,生产上常见优化手段是
route:cache、config:cache、view:cache,并用 OPcache +opcache.preload,再配合 Redis/数据库连接池化。
自测三问
- 不看资料,说出从浏览器发出请求到控制器方法被调用,Laravel 经过了哪几个关键环节?
.env、config/*.php、环境变量三者的读取优先级是怎样的?为什么开发环境不要执行config:cache?- Breeze、Jetstream、Livewire、Reverb 分别解决什么问题?什么场景选哪一个?
小结一句话
Laravel 把 Web 后端的通用设施打包进一个约定统一的框架里,装好 PHP 8.2、Composer,跑起 artisan serve 并看懂入口与脚手架选项,你就站在了后续所有课程的起点上。
延伸
- Laravel 11 官方文档(英文)
- Laravel 中文文档(社区维护)
- Laravel Herd 下载
- Composer 官方文档
- 下一课:目录结构、配置与请求生命周期——我们会把今天看到的每一个目录拆开讲清楚,并对照 Spring Boot 项目布局。