Laravel Valet
简介
正在寻找一种在 macOS 或 Windows 上开发 Laravel 应用程序的更简单方法?查看 Laravel Herd。Herd 包含开始 Laravel 开发所需的一切,包括 Valet、PHP 和 Composer。
Laravel Valet 是一个为 macOS 极简主义者提供的开发环境。Laravel Valet 配置你的 Mac,使其在你的机器启动时始终在后台运行 Nginx。然后,使用 DnsMasq,Valet 将 *.test
域上的所有请求代理到安装在你本地机器上的站点。
换句话说,Valet 是一个速度极快的 Laravel 开发环境,大约使用 7 MB 的 RAM。Valet 不是 Sail 或 Homestead 的完整替代品,但如果你想要灵活的基础知识,偏爱极快的速度,或者正在使用内存有限的机器,它是一个很好的替代方案。
开箱即用,Valet 支持包括但不限于
但是,你可以使用自己的 自定义驱动程序扩展 Valet。
安装
Valet 需要 macOS 和 Homebrew。在安装之前,你应该确保没有其他程序(例如 Apache 或 Nginx)绑定到你本地机器的 80 端口。
要开始使用,你首先需要使用 update
命令确保 Homebrew 是最新的
brew update
接下来,你应该使用 Homebrew 安装 PHP
brew install php
安装 PHP 后,你就可以安装 Composer 包管理器了。此外,你应该确保 $HOME/.composer/vendor/bin
目录在你的系统的“PATH”中。安装 Composer 后,你可以将 Laravel Valet 作为全局 Composer 包安装
composer global require laravel/valet
最后,你可以执行 Valet 的 install
命令。这将配置并安装 Valet 和 DnsMasq。此外,将配置 Valet 依赖的守护进程,以便在系统启动时启动
valet install
安装 Valet 后,请尝试使用 ping foobar.test
等命令在终端上 ping 任何 *.test
域。如果 Valet 安装正确,你应看到此域在 127.0.0.1
上响应。
每次你的机器启动时,Valet 都会自动启动其所需的服务。
PHP 版本
你可以通过 isolate
命令指示 Valet 使用每个站点的 PHP 版本,而不是修改你的全局 PHP 版本。
Valet 允许你使用 valet use php@version
命令切换 PHP 版本。如果尚未安装,Valet 将通过 Homebrew 安装指定的 PHP 版本
valet use php
你还可以在你的项目根目录中创建一个 .valetrc
文件。.valetrc
文件应包含站点应使用的 PHP 版本
php=php@8.2
创建此文件后,你可以简单地执行 valet use
命令,该命令将通过读取文件来确定站点的首选 PHP 版本。
即使你安装了多个 PHP 版本,Valet 一次也只提供一个 PHP 版本。
数据库
如果你的应用程序需要数据库,请查看 DBngin,它提供了一个免费的、一体化的数据库管理工具,其中包括 MySQL、PostgreSQL 和 Redis。安装 DBngin 后,你可以使用 root
用户名和空字符串作为密码在 127.0.0.1
上连接到你的数据库。
重置你的安装
如果你在让 Valet 安装正常运行方面遇到问题,请执行 composer global require laravel/valet
命令,然后执行 valet install
将重置你的安装,并可以解决各种问题。在极少数情况下,可能需要执行 valet uninstall --force
,然后执行 valet install
来“硬重置”Valet。
升级 Valet
你可以通过在你的终端中执行 composer global require laravel/valet
命令来更新你的 Valet 安装。升级后,最好运行 valet install
命令,以便 Valet 可以在必要时对你的配置文件进行其他升级。
升级到 Valet 4
如果你要从 Valet 3 升级到 Valet 4,请执行以下步骤来正确升级你的 Valet 安装
- 如果你添加了
.valetphprc
文件来定制你站点的 PHP 版本,请将每个.valetphprc
文件重命名为.valetrc
。然后,将php=
添加到.valetrc
文件的现有内容的前面。 - 更新所有自定义驱动程序,以匹配新驱动程序系统的命名空间、扩展名、类型提示和返回类型提示。你可以参考 Valet 的 SampleValetDriver 作为示例。
- 如果你使用 PHP 7.1 - 7.4 来服务你的站点,请确保你仍然使用 Homebrew 安装 8.0 或更高版本的 PHP,因为 Valet 将使用此版本(即使它不是你的主要链接版本)来运行其某些脚本。
服务站点
安装 Valet 后,你就可以开始服务你的 Laravel 应用程序了。Valet 提供了两个命令来帮助你服务你的应用程序:park
和 link
。
park
命令
park
命令在你机器上注册一个包含你的应用程序的目录。一旦目录被 Valet“停放”,该目录中的所有目录都可以在你的 Web 浏览器中通过 http://<directory-name>.test
访问
cd ~/Sites valet park
这就是全部内容。现在,你在“停放”目录中创建的任何应用程序都将使用 http://<directory-name>.test
约定自动服务。因此,如果你的停放目录包含一个名为“laravel”的目录,则该目录中的应用程序将在 http://laravel.test
中访问。此外,Valet 还会自动允许你使用通配符子域名(http://foo.laravel.test
)访问该站点。
link
命令
link
命令也可用于服务你的 Laravel 应用程序。如果你想在目录中服务一个站点而不是整个目录,则此命令非常有用
cd ~/Sites/laravel valet link
使用 link
命令将应用程序链接到 Valet 后,你可以使用其目录名称访问该应用程序。因此,可以使用 http://laravel.test
访问上面示例中链接的站点。此外,Valet 还会自动允许你使用通配符子域名(http://foo.laravel.test
)访问该站点。
如果你想在不同的主机名上服务应用程序,你可以将主机名传递给 link
命令。例如,你可以运行以下命令使应用程序在 http://application.test
上可用
cd ~/Sites/laravel valet link application
当然,你也可以使用 link
命令在子域上服务应用程序
valet link api.application
你可以执行 links
命令以显示所有链接目录的列表
valet links
可以使用 unlink
命令销毁站点的符号链接
cd ~/Sites/laravel valet unlink
使用 TLS 保护站点
默认情况下,Valet 通过 HTTP 提供站点服务。但是,如果您希望使用 HTTP/2 通过加密的 TLS 提供站点服务,可以使用 secure
命令。例如,如果您的站点由 Valet 在 laravel.test
域名上提供服务,则应运行以下命令来保护它:
valet secure laravel
要“取消保护”一个站点并恢复通过普通 HTTP 提供流量,请使用 unsecure
命令。与 secure
命令一样,此命令接受您希望取消保护的主机名:
valet unsecure laravel
服务默认站点
有时,您可能希望配置 Valet 在访问未知 test
域名时提供“默认”站点,而不是 404
错误。要实现这一点,您可以在 ~/.config/valet/config.json
配置文件中添加一个 default
选项,其中包含应作为默认站点的站点的路径:
"default": "/Users/Sally/Sites/example-site",
每个站点的 PHP 版本
默认情况下,Valet 使用您的全局 PHP 安装来提供站点服务。但是,如果您需要支持跨多个站点的多个 PHP 版本,可以使用 isolate
命令来指定特定站点应使用的 PHP 版本。isolate
命令配置 Valet 为您当前工作目录中的站点使用指定的 PHP 版本:
cd ~/Sites/example-site
如果您的站点名称与包含它的目录的名称不匹配,可以使用 --site
选项指定站点名称:
为了方便起见,您可以使用 valet php
、composer
和 which-php
命令来代理对基于站点配置的 PHP 版本的适当 PHP CLI 或工具的调用:
valet phpvalet composervalet which-php
您可以执行 isolated
命令来显示所有隔离的站点及其 PHP 版本的列表:
valet isolated
要将站点恢复到 Valet 的全局安装的 PHP 版本,您可以从站点的根目录调用 unisolate
命令:
valet unisolate
共享站点
Valet 包含一个与世界共享本地站点的命令,提供了一种在移动设备上测试您的站点或与团队成员和客户共享的简便方法。
开箱即用,Valet 支持通过 ngrok 或 Expose 共享您的站点。在共享站点之前,您应该使用 share-tool
命令更新您的 Valet 配置,指定 ngrok
或 expose
:
valet share-tool ngrok
如果您选择了工具但没有通过 Homebrew(对于 ngrok)或 Composer(对于 Expose)安装它,Valet 将自动提示您安装它。当然,两种工具都要求您在开始共享站点之前对您的 ngrok 或 Expose 帐户进行身份验证。
要共享站点,请在您的终端中导航到站点的目录并运行 Valet 的 share
命令。一个可公开访问的 URL 将被放置到您的剪贴板中,您可以直接粘贴到您的浏览器中或与您的团队共享:
cd ~/Sites/laravel valet share
要停止共享您的站点,您可以按 Control + C
:
如果您使用的是自定义 DNS 服务器(例如 1.1.1.1
),ngrok 共享可能无法正常工作。如果您的计算机上出现这种情况,请打开 Mac 的系统设置,转到“网络”设置,打开“高级”设置,然后转到“DNS”选项卡并将 127.0.0.1
添加为您的第一个 DNS 服务器:
通过 Ngrok 共享站点
使用 ngrok 共享您的站点需要您创建一个 ngrok 帐户 并设置一个身份验证令牌。拥有身份验证令牌后,您可以使用该令牌更新您的 Valet 配置:
valet set-ngrok-token YOUR_TOKEN_HERE
您可以将其他 ngrok 参数传递给 share 命令,例如 valet share --region=eu
。有关更多信息,请查阅 ngrok 文档。
通过 Expose 共享站点
使用 Expose 共享您的站点需要您创建一个 Expose 帐户 并通过您的身份验证令牌对 Expose 进行身份验证。
您可以查阅 Expose 文档 以获取有关它支持的其他命令行参数的信息。
在本地网络上共享站点
默认情况下,Valet 将传入流量限制为内部 127.0.0.1
接口,以避免您的开发机器暴露于来自 Internet 的安全风险。
如果您希望允许本地网络上的其他设备通过您机器的 IP 地址(例如:192.168.1.10/application.test
)访问您机器上的 Valet 站点,则需要手动编辑该站点的相应 Nginx 配置文件,以删除对 listen
指令的限制。您应该删除端口 80 和 443 的 listen
指令上的 127.0.0.1:
前缀。
如果您尚未在项目上运行 valet secure
,则可以通过编辑 /usr/local/etc/nginx/valet/valet.conf
文件来为所有非 HTTPS 站点打开网络访问。但是,如果您通过 HTTPS 提供项目站点(您已为站点运行 valet secure
),则应编辑 ~/.config/valet/Nginx/app-name.test
文件。
更新 Nginx 配置后,运行 valet restart
命令以应用配置更改。
特定站点的环境变量
某些使用其他框架的应用程序可能依赖于服务器环境变量,但没有提供在您的项目中配置这些变量的方法。Valet 允许您通过在项目的根目录中添加 .valet-env.php
文件来配置特定于站点的环境变量。此文件应返回站点/环境变量对的数组,这些对将添加到每个数组中指定的站点的全局 $_SERVER
数组中:
<?php return [ // Set $_SERVER['key'] to "value" for the laravel.test site... 'laravel' => [ 'key' => 'value', ], // Set $_SERVER['key'] to "value" for all sites... '*' => [ 'key' => 'value', ],];
代理服务
有时,您可能希望将 Valet 域名代理到本地计算机上的另一个服务。例如,您可能偶尔需要在运行 Valet 的同时在 Docker 中运行单独的站点;但是,Valet 和 Docker 不能同时绑定到端口 80。
要解决此问题,您可以使用 proxy
命令生成代理。例如,您可以将来自 http://elasticsearch.test
的所有流量代理到 http://127.0.0.1:9200
:
# Proxy over HTTP...valet proxy elasticsearch http://127.0.0.1:9200 # Proxy over TLS + HTTP/2...valet proxy elasticsearch http://127.0.0.1:9200 --secure
您可以使用 unproxy
命令删除代理:
valet unproxy elasticsearch
您可以使用 proxies
命令列出所有被代理的站点配置:
valet proxies
自定义 Valet 驱动程序
您可以编写自己的 Valet“驱动程序”,以提供在 Valet 本机不支持的框架或 CMS 上运行的 PHP 应用程序。当您安装 Valet 时,会创建一个 ~/.config/valet/Drivers
目录,其中包含一个 SampleValetDriver.php
文件。此文件包含一个示例驱动程序实现,用于演示如何编写自定义驱动程序。编写驱动程序只需要您实现三个方法:serves
、isStaticFile
和 frontControllerPath
。
所有三个方法都接收 $sitePath
、$siteName
和 $uri
值作为其参数。$sitePath
是您计算机上提供的站点的完全限定路径,例如 /Users/Lisa/Sites/my-project
。$siteName
是域名 (my-project
) 的“主机”/“站点名称”部分。$uri
是传入的请求 URI (/foo/bar
)。
完成自定义 Valet 驱动程序后,使用 FrameworkValetDriver.php
命名约定将其放置在 ~/.config/valet/Drivers
目录中。例如,如果您正在为 WordPress 编写自定义 valet 驱动程序,则您的文件名应为 WordPressValetDriver.php
。
让我们看一下自定义 Valet 驱动程序应实现的每个方法的示例实现。
serves
方法
如果您的驱动程序应处理传入的请求,则 serves
方法应返回 true
。否则,该方法应返回 false
。因此,在此方法中,您应该尝试确定给定的 $sitePath
是否包含您要尝试服务的类型的项目。
例如,假设我们正在编写 WordPressValetDriver
。我们的 serves
方法可能如下所示:
/** * Determine if the driver serves the request. */public function serves(string $sitePath, string $siteName, string $uri): bool{ return is_dir($sitePath.'/wp-admin');}
isStaticFile
方法
isStaticFile
应该确定传入的请求是否用于“静态”文件,例如图像或样式表。如果文件是静态的,则该方法应返回磁盘上静态文件的完全限定路径。如果传入的请求不是静态文件,则该方法应返回 false
:
/** * Determine if the incoming request is for a static file. * * @return string|false */public function isStaticFile(string $sitePath, string $siteName, string $uri){ if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) { return $staticFilePath; } return false;}
仅当 serves
方法对传入的请求返回 true
且请求 URI 不是 /
时,才会调用 isStaticFile
方法。
frontControllerPath
方法
frontControllerPath
方法应返回应用程序的“前端控制器”的完全限定路径,这通常是“index.php”文件或等效文件:
/** * Get the fully resolved path to the application's front controller. */public function frontControllerPath(string $sitePath, string $siteName, string $uri): string{ return $sitePath.'/public/index.php';}
本地驱动程序
如果您想为单个应用程序定义自定义 Valet 驱动程序,请在应用程序的根目录中创建一个 LocalValetDriver.php
文件。您的自定义驱动程序可以扩展基类 ValetDriver
类或扩展现有的特定于应用程序的驱动程序,例如 LaravelValetDriver
:
use Valet\Drivers\LaravelValetDriver; class LocalValetDriver extends LaravelValetDriver{ /** * Determine if the driver serves the request. */ public function serves(string $sitePath, string $siteName, string $uri): bool { return true; } /** * Get the fully resolved path to the application's front controller. */ public function frontControllerPath(string $sitePath, string $siteName, string $uri): string { return $sitePath.'/public_html/index.php'; }}
其他 Valet 命令
命令 | 描述 |
---|---|
valet list |
显示所有 Valet 命令的列表。 |
valet diagnose |
输出诊断信息以帮助调试 Valet。 |
valet directory-listing |
确定目录列表行为。默认值为“off”,它会为目录呈现 404 页面。 |
valet forget |
从“停放”的目录中运行此命令,将其从停放的目录列表中删除。 |
valet log |
查看 Valet 服务写入的日志列表。 |
valet paths |
查看所有“停放”的路径。 |
valet restart |
重新启动 Valet 守护程序。 |
valet start |
启动 Valet 守护程序。 |
valet stop |
停止 Valet 守护程序。 |
valet trust |
为 Brew 和 Valet 添加 sudoers 文件,以允许运行 Valet 命令而无需提示您输入密码。 |
valet uninstall |
卸载 Valet:显示手动卸载的说明。传递 --force 选项以强制删除 Valet 的所有资源。 |
Valet 目录和文件
您可能会发现以下目录和文件信息在解决 Valet 环境问题时很有用:
~/.config/valet
包含 Valet 的所有配置。您可能希望维护此目录的备份。
~/.config/valet/dnsmasq.d/
此目录包含 DNSMasq 的配置。
~/.config/valet/Drivers/
此目录包含 Valet 的驱动程序。驱动程序确定如何提供特定的框架/CMS。
~/.config/valet/Nginx/
此目录包含 Valet 的所有 Nginx 站点配置。在运行 install
和 secure
命令时会重建这些文件。
~/.config/valet/Sites/
此目录包含您的链接项目的所有符号链接。
~/.config/valet/config.json
这是 Valet 的主配置文件。
~/.config/valet/valet.sock
这是 Valet 的 Nginx 安装使用的 PHP-FPM 套接字文件。只有当 PHP 正常运行时,此文件才会存在。
~/.config/valet/Log/fpm-php.www.log
此文件是 PHP 错误的 用户日志。
~/.config/valet/Log/nginx-error.log
此文件是 Nginx 错误的 用户日志。
/usr/local/var/log/php-fpm.log
此文件是 PHP-FPM 错误的 系统日志。
/usr/local/var/log/nginx
此目录包含 Nginx 的访问和错误日志。
/usr/local/etc/php/X.X/conf.d
此目录包含各种 PHP 配置设置的 *.ini
文件。
/usr/local/etc/php/X.X/php-fpm.d/valet-fpm.conf
此文件是 PHP-FPM 池配置文件。
~/.composer/vendor/laravel/valet/cli/stubs/secure.valet.conf
此文件是用于为您的站点构建 SSL 证书的默认 Nginx 配置。
磁盘访问
自 macOS 10.14 起,默认情况下,对某些文件和目录的访问受到限制。这些限制包括桌面、文档和下载目录。此外,网络卷和可移动卷的访问也受到限制。因此,Valet 建议您的站点文件夹位于这些受保护位置之外。
但是,如果您希望从这些位置之一提供站点服务,您需要授予 Nginx “完全磁盘访问权限”。否则,您可能会遇到服务器错误或 Nginx 的其他不可预测的行为,尤其是在提供静态资源时。通常,macOS 会自动提示您授予 Nginx 对这些位置的完全访问权限。或者,您可以手动通过 系统偏好设置
> 安全性与隐私
> 隐私
并选择 完全磁盘访问权限
来执行此操作。接下来,启用主窗口窗格中的任何 nginx
条目。