Laravel Valet 是 macOS 上运行 Laravel 8 的首选方案,它轻量(仅约7MB内存)、无需虚拟机或修改 hosts、自动 HTTPS、支持按项目切换 PHP 版本,且原生适配 Apple Silicon 与 macOS Sequoia+;Homestead 已进入维护模式,XAMPP 存在兼容性问题。

直接说结论:Laravel 8 在 macOS 上已不推荐用 Homestead 或手动配 Apache/Nginx,laravel valet 是当前最轻量、稳定、符合 Apple Silicon(M1/M2/M3)和 macOS 新系统(Sequoia 及以后)的首选方案。它不依赖虚拟机,不改 hosts,自动 HTTPS,且能按项目切换 PHP 版本。
为什么不用 Homestead 或 XAMPP
Laravel 8 发布于 2020 年,官方在 2022 年起就明确将 valet 列为 macOS 首选开发工具,Homestead 已进入维护模式;XAMPP 依赖过时的 PHP 扩展(如 mcrypt),macOS Monterey(12+)起默认禁用 32 位组件,XAMPP 的 Apache 模块常报 Symbol not found: _iconv_open 类错误。Homestead 则需 VirtualBox + Vagrant,启动慢、内存占用高、与 macOS 的 SIP 和 Rosetta 2 兼容性差,尤其在 M 系列芯片上容易卡在 vagrant up 的 NFS 挂载阶段。
安装 valet 的硬性前置条件
必须确保以下三项已就绪,缺一不可:
-
xcode-select --install已运行(提供底层编译工具链) -
brew已安装且可执行(Valet 依赖 Homebrew 安装 PHP、dnsmasq 等) - PHP 版本 ≥ 7.3(Laravel 8 最低要求),但强烈建议用
php@8.1或php@8.2(Homebrew 默认不再提供php@7.4,且 8.1+ 对 OpenSSL、cURL、PDO 的兼容更稳)
验证方式:php -v 输出应含 8.1. 或 8.2.;若显示系统自带 PHP(版本 8.0 以下或路径含 /usr/bin/php),需先运行 brew unlink php && brew link php@8.1(或对应版本)。
valet install 后必须做的三件事
valet install 命令本身不会自动配置 Laravel 项目所需的关键环节,漏掉任一都会导致访问 500 错误或环境变量失效:
- 执行
valet park(不是valet link)——在你存放项目的父目录(如~/Sites)下运行,这样该目录下所有子文件夹都会被自动映射为xxx.test域名 - 确认项目根目录存在
.env文件:若只有.env.example,需手动复制并重命名:cp .env.example .env,再运行php artisan key:generate - 检查
storage和bootstrap/cache目录权限:sudo chmod -R 775 storage bootstrap/cache(macOS 默认 ACL 机制可能导致 Valet 以不同用户身份写入失败)
常见现象:浏览器打开 myapp.test 显示 Whoops, looks like something went wrong,但终端无报错——大概率是 .env 缺失或 APP_KEY 未生成。
遇到 “No application encryption key has been specified” 怎么办
这个错误只说明 Laravel 应用启动时读不到 APP_KEY,但原因不止一个:
-
.env文件确实不存在或被 gitignore 忽略了(检查是否误删) -
.env存在但权限为600且属主不是当前运行 Valet 的用户(ls -l .env查看,应为-rw-r--r--) -
php artisan key:generate执行后没写入成功(可能因bootstrap/cache/config.php被缓存,先运行php artisan config:clear再试) - 用了自定义
APP_ENV=local但config/app.php中'key' => env('APP_KEY'),被意外注释或改写
最简验证法:在项目根目录执行 php -r "echo env('APP_KEY');",如果输出为空,问题就出在 .env 加载环节,不是密钥本身。
真正麻烦的是那些不报错但页面空白的情况——比如 Valet 日志里出现 PHP Parse error: syntax error, unexpected token "&",这其实是 PHP 8.0+ 的新语法(&& 替代 and)和 Laravel 8 的某些第三方包冲突,得去 composer.json 里锁死 "php": "^8.1" 并运行 composer update --with-all-dependencies。这种细节,文档从不提,但你跑不通时八成撞上它。


















