[!NOTE]
正在寻找在 macOS 或 Windows 上开发 Laravel 应用程序的更简便方法?查看 Laravel Herd。Herd 包含您开始 Laravel 开发所需的一切,包括 Valet、PHP 和 Composer。
Laravel Valet 是一个适用于 macOS 极简主义者的开发环境。Laravel Valet 会配置你的 Mac,使其在机器启动时始终在后台运行 Nginx。然后,使用 DnsMasq,Valet 会将所有在 *.test 域上的请求代理到安装在你本地机器上的站点。
换句话说,Valet 是一个极速的 Laravel 开发环境,大约占用 7 MB 内存。 Valet 并非 Sail 或 Homestead 的完全替代品,但提供了一个很好的替代方案,如果您想要灵活的基础功能、追求极致速度,或者正在内存有限的机器上工作。
开箱即用,Valet 支持包括但不限于:
然而,你可以用自己的自定义驱动程序扩展 Valet。
[!警告]
Valet 需要 macOS 和 Homebrew。在安装之前,您应该确保没有其他程序例如 Apache 或 Nginx 绑定到您本地机器的端口 80。
要开始使用,您首先需要确保 Homebrew 是最新版本,使用 update 命令:
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 installValet 安装完成后,尝试在您的终端上 ping 任何 *.test 域使用诸如 ping foobar.test 的命令。如果 Valet 安装正确,您应该会看到此域在 127.0.0.1 上响应。
Valet 将在您的机器每次启动时自动启动其所需服务。
[!NOTE]
与其修改全局 PHP 版本,你可以指示 Valet 通过isolate命令 使用按站点划分的 PHP 版本。
Valet 允许您使用 valet use php@version 命令切换 PHP 版本。如果指定的 PHP 版本尚未安装,Valet 将通过 Homebrew 进行安装:
valet use php@8.2
valet use php你也可以在你的项目根目录中创建一个 .valetrc 文件。 该 .valetrc 文件应包含该站点应使用的 PHP 版本:
php=php@8.2一旦这个文件被创建,你只需执行 valet use 命令,该命令就会通过读取该文件来确定站点的首选 PHP 版本。
[!WARNING]
Valet 一次只服务一个 PHP 版本,即使您安装了多个 PHP 版本。
如果你的应用程序需要数据库,请查看 DBngin,它提供了一个免费的一体化数据库管理工具,包含 MySQL、PostgreSQL 和 Redis。DBngin 安装后,你可以连接到你的数据库,地址为 127.0.0.1,使用 root 用户名,密码为空字符串。
如果您的 Valet 安装运行不正常,执行 composer global require laravel/valet 命令后执行 valet install 将重置您的安装并能解决各种问题。 在极少数情况下,可能需要“硬重置”Valet 通过执行 valet uninstall --force 后执行 valet install。
你可以通过在你的终端中执行 composer global require laravel/valet 命令来更新你的 Valet 安装。升级后,最好运行 valet install 命令,以便 Valet 在必要时对你的配置文件进行额外的升级。
如果您要从 Valet 3 升级到 Valet 4,请执行以下步骤以正确升级您的 Valet 安装:
Valet 安装完成后,您就可以开始为您的 Laravel 应用程序提供服务了。Valet 提供了两个命令来帮助您为应用程序提供服务:park 和 link。
park 命令park 命令在你的机器上注册一个包含你的应用程序的目录。一旦该目录被 Valet "park" 后,该目录内的所有目录都将可以在你的网络浏览器中通过 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 linksunlink 命令可用于删除某个站点的符号链接:
cd ~/Sites/laravel
valet unlink默认情况下, Valet 通过 HTTP 提供站点服务. 然而, 如果你希望通过加密的 TLS 使用 HTTP/2 提供站点服务, 你可以使用 secure 命令. 例如, 如果你的站点正在由 Valet 在 laravel.test 域名上提供服务, 你应该运行以下命令来保护它:
valet secure laravel要“取消安全保护”网站并恢复通过纯HTTP协议提供流量,请使用 unsecure 命令。与 secure 命令一样,此命令接受您希望取消安全保护的主机名:
valet unsecure laravel有时,您可能希望将 Valet 配置为在访问未知 test 域时提供“默认”站点,而不是 404。为此,您可以在 ~/.config/valet/config.json 配置文件中添加一个 default 选项,其中包含应作为默认站点的路径:
"默认": "/Users/Sally/Sites/example-site",
默认情况下,Valet 使用你的全局 PHP 安装来为你的站点提供服务。但是,如果你需要在不同站点之间支持多个 PHP 版本,你可以使用 isolate 命令来指定特定站点应使用的 PHP 版本。 isolate 命令会将 Valet 配置为使用指定的 PHP 版本来运行你当前工作目录中的站点:
cd ~/Sites/example-site
valet isolate php@8.0如果您的站点名称不匹配包含它的目录名称,您可以指定站点名称,使用 --site 选项:
valet isolate php@8.0 --site="site-name"为方便起见, 您可以使用 valet php, composer, 和 which-php 命令来代理对相应 PHP CLI 或工具的调用, 具体取决于站点配置的 PHP 版本:
valet php
valet composer
valet which-php您可以执行 isolated 命令,以显示您所有隔离站点及其 PHP 版本的列表:
valet isolated要将站点恢复到 Valet 全局安装的 PHP 版本,您可以从站点的根目录中调用 unisolate 命令:
valet unisolateValet 包含一个命令,用于将你的本地站点共享到全球,提供了一种简单的方式来在移动设备上测试你的站点或与团队成员和客户共享。
默认情况下,Valet 支持通过 ngrok 或 Expose 共享您的站点。在共享站点之前,您应该使用 share-tool 命令更新 Valet 配置,并指定 ngrok、expose 或 cloudflared:
valet share-tool ngrok如果你选择了一个工具,但没有通过 Homebrew(针对 ngrok 和 cloudflared)或 Composer(针对 Expose)安装它,Valet 将会自动提示你安装。当然,这两个工具都需要你先验证你的 ngrok 或 Expose 账户,然后才能开始共享站点。
要共享站点,请在终端中导航到该站点的目录并运行 Valet 的 share 命令。一个公开可访问的 URL 将被放置到剪贴板中,可以直接粘贴到浏览器中,或与您的团队共享:
cd ~/Sites/laravel
valet share要停止共享您的站点,您可以按下 Control + C。
[!WARNING]
If you're using a custom DNS server (like1.1.1.1), ngrok sharing may not work correctly. If this is the case on your machine, open your Mac's system settings, go to the Network settings, open the Advanced settings, then go the DNS tab and add127.0.0.1as your first DNS server.
使用 ngrok 共享你的网站需要你 创建一个 ngrok 账户 和 设置一个认证令牌。一旦你有了认证令牌,你就可以使用该令牌更新你的 Valet 配置:
valet set-ngrok-token YOUR_TOKEN_HERE[!注意]
您可以向 share 命令传递额外的 ngrok 参数,例如valet share --region=eu。 欲了解更多信息,请查阅 ngrok 文档。
使用 Expose 共享你的网站需要你创建 Expose 账户 和 通过你的认证令牌向 Expose 进行认证.
您可以查阅 Expose 文档,以获取有关其支持的额外命令行参数的信息。
Valet 默认情况下将传入流量限制到内部 127.0.0.1 接口,以便你的开发机器不会暴露于来自互联网的安全风险。
如果您希望允许本地网络上的其他设备通过您机器的 IP 地址访问您机器上的 Valet 站点 (例如: 192.168.1.10/application.test), 您将需要手动编辑该站点相应的 Nginx 配置文件以移除对 listen 指令的限制。 您应该移除 listen 指令中端口 80 和 443 的 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 不原生支持的框架或 CMS 上的 PHP 应用程序提供服务。当你安装 Valet 时,会创建一个 ~/.config/valet/Drivers 目录,其中包含一个 SampleValetDriver.php 文件。此文件包含一个示例驱动程序实现,用于演示如何编写自定义驱动程序。编写驱动程序只需要你实现三个方法:serves、isStaticFile 和 frontControllerPath。
所有这三种方法都接收 $sitePath、$siteName 和 $uri 值作为它们的参数。$sitePath 是您机器上所服务的站点的完全限定路径,例如 /Users/Lisa/Sites/my-project。$siteName 是域名的“host” / “site name” 部分 (my-project)。$uri 是传入的请求 URI (/foo/bar)。
完成自定义 Valet 驱动程序后,请将其放置在 ~/.config/valet/Drivers 目录中,并使用 FrameworkValetDriver.php 命名约定。例如,如果您正在为 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;
}[!WARNING]
只有在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 环境问题时,您可能会发现以下目录和文件信息很有帮助:
~/.config/valet包含 Valet 的所有配置。您可能希望维护此目录的备份。
~/.config/valet/dnsmasq.d/此目录包含 DNSMasq 的配置。
~/.config/valet/Drivers/此目录包含 Valet 的驱动程序。驱动程序决定了特定框架 / CMS 的服务方式。
~/.config/valet/Nginx/此目录包含 Valet 的所有 Nginx 站点配置。当运行 install 和 secure 命令时,这些文件会被重建。
~/.config/valet/站点/此目录包含所有指向您的链接项目的符号链接.
~/.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 条目。