CodeRoad Map 程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。
由 程序员柏风 独立维护 · 关于作者
学习 更多
Laravel 概览 安装、Herd 与 Starter Kits。
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 + KernelDispatcherServlet 请求统一入口 Middleware Filter / Interceptor 横切处理(鉴权、CORS) Service Container IoC Container 依赖注入容器 Eloquent JPA / MyBatis 数据访问 Facade / 助手函数 @Autowired Bean取用框架服务 artisan spring-boot-maven-plugin 命令行脚手架
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 并看懂入口与脚手架选项,你就站在了后续所有课程的起点上。
延伸